ASP.NET: аутентификация пользователя в коде - PullRequest
3 голосов
/ 17 сентября 2009

Я играю с аутентификацией и авторизацией, чтобы подготовиться к какой-то задаче. Я создал две страницы: Login.aspx и Default.aspx. В конфигурационном файле я установил аутентификацию для форм и запретил доступ неаутентифицированным пользователям:

<authentication mode="Forms">
      <forms name="aaa" defaultUrl="~/Login.aspx" />
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>

Тогда я написал простой код для аутентификации моего пользователя в Login.aspx:

protected void Page_Load(object sender, EventArgs e)
        {
            GenericIdentity identity = new GenericIdentity("aga", "bbb");
            Context.User = new GenericPrincipal(identity, new String[] { "User" }); ;
            Response.Redirect("~/Default.aspx");
        }

Когда я запускаю его, перенаправление не происходит. Вместо этого Login.aspx вызывается снова и снова, потому что пользователь не аутентифицирован (Context.User.Identity.IsAuthenticated имеет значение false при каждой загрузке). Что я делаю не так?

Ответы [ 5 ]

7 голосов
/ 17 сентября 2009

Context.User только устанавливает принципал для текущего запроса. Как только происходит перенаправление, текущий запрос заканчивается, и новый снова начинается с не переопределенного принципала (который, очевидно, не аутентифицирован). Таким образом, установка Context.User на самом деле ничего не аутентифицирует.

Использование FormsAuthentication.SetAuthCookie () установит для файла cookie пользователя допустимое значение, принятое поставщиком FormsAuthentication, или поместит маркер в URL-адрес. Вы можете перенаправить на ваш душевный контент, потому что cookie, очевидно, остается у пользователя для будущих запросов.

Из MSDN (добавлено):

При проверке подлинности с помощью форм вы можете использовать метод SetAuthCookie, когда хотите аутентифицировать пользователя , но при этом сохраняете контроль над навигацией с помощью перенаправлений .

Как уже говорилось, для этого необязательно требуются файлы cookie - имя немного вводит в заблуждение, поскольку оно все равно будет работать через URL, если FormsAuthentication находится в режиме без файлов cookie:

Метод SetAuthCookie добавляет билет для проверки подлинности с помощью форм либо в коллекцию файлов cookie, либо в URL-адрес, если CookiesSupported имеет значение false.

4 голосов
/ 17 сентября 2009
1 голос
/ 17 сентября 2009

Вы должны фактически установить пользователя как аутентифицированного. Все следующие методы будут работать и позволят вам на самом деле уйти с экрана входа в систему.

FormsAuthentication.Authenticate()
FormsAuthentication.RedirectFromLoginPage()
FormsAuthentication.SetAuthCookie()

Множество способов получить тот же результат.

0 голосов
/ 17 сентября 2009

После создания фиктивного Context.User вам необходимо выполнить метод FormsAuthentication.SetAuthCookie или RedirectFromLoginPage.

0 голосов
/ 17 сентября 2009

На самом деле вам нужно позвонить поставщику formsAuthentication для установки имени входа.

FormsAuthentication.RedirectFromLoginPage (txtUser.Text, chkPersistLogin.Checked)

простой пример

...