Как установить для Request.IsAuthenticated значение true, если не используется FormsAuthentication.RedirectFromLoginPage? - PullRequest
26 голосов
/ 21 января 2010

Я использую Аутентификацию по форме и отправляю запрос Aajx на сервер для аутентификации. На основе результата json клиент решает, куда идти и что делать. Именно поэтому я не использую FormsAuthentication.RedirectFromLoginPage, чтобы не мешать ответу ajax / json.

В этом случае Request.IsAuthenticated возвращает false, даже после проверки пользователя с помощью Membership.ValidateUser. Затем я установил cookie, используя

FormsAuthentication.SetAuthCookie(username, false);

Хотя второй параметр, постоянный файл cookie, имеет значение false, файл cookie все еще действует в сеансах браузера.

Есть идеи, как заставить Request.IsAuthenticated работать без использования FormsAuthentication.RedirectFromLoginPage?

Ответы [ 3 ]

24 голосов
/ 21 января 2010

Вам необходимо обновить текущий участник безопасности для запроса. Когда вы звоните Response. Redirect(...), новый запрос выполняется, и субъект безопасности повторно инициализируется, и Request.IsAuthenticated возвращает true в вашем случае. FormsAuthentication.RedirectFromLoginPage внутренне звонит Response. Redirect(...). Вы можете вручную обновить субъект безопасности для текущего запроса следующим образом:

public void RenewCurrentUser()
{
    System.Web.HttpCookie authCookie =
        System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null)
    {
        FormsAuthenticationTicket authTicket = null;
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);

        if (authTicket != null && !authTicket.Expired)
        {
            FormsAuthenticationTicket newAuthTicket = authTicket;

            if (FormsAuthentication.SlidingExpiration)
            {
                newAuthTicket = FormsAuthentication.RenewTicketIfOld(authTicket);
            }
            string userData = newAuthTicket.UserData;
            string[] roles = userData.Split(',');

            System.Web.HttpContext.Current.User =
                new System.Security.Principal.GenericPrincipal(new FormsIdentity(newAuthTicket), roles);
        }
    }
}
20 голосов
/ 22 января 2010

FormsAuthentication.SetAuthCookie

Метод Создает аутентификацию билет на предоставленное имя пользователя и добавляет его в коллекцию куки ответ или на URL, если вы с использованием аутентификации без файлов cookie.

Ссылка: MSDN

Посмотрите на поток управления аутентификацией Forms . Cookie-файл аутентификации устанавливается на коллекцию cookie-ответов и должен быть доступен на уровне протокола http (например, используйте FireCookie или Fiddler2 для проверки этого).

Членство подтверждает только имя пользователя / пароль. Ни членство, ни SetAuthCookie() не изменят текущий запрос. Они ожидают отправки куки обратно вызывающей стороне, и запрос next - это когда свойства типа IsAuthenticated вернут true.

Обратите внимание, что вы можете переопределить и расширить эти автоматические процессы, используя пользовательские IIdentity и IPrincipal, и подключиться к событиям аутентификации, если вам нужно.

Также взгляните на Использование проверки подлинности с помощью форм с ASP.NET AJAX

2 голосов
/ 21 сентября 2014

Перенаправление после POST является наилучшей практикой и должно рассматриваться как правильное решение.

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

В этом случае вы можете сбросить значение Request.IsAuthenticated с помощью следующего кода:

// set the forms auth cookie
FormsAuthentication.SetAuthCookie(username, createPersistentCookie);

// reset request.isauthenticated
var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    if (authTicket != null && !authTicket.Expired)
    {
        var roles = authTicket.UserData.Split(',');
        System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles);
    }
 }

Смотрите пост здесь: http://abadjimarinov.net/blog/2010/01/24/RenewUserInTheSameRequestInAspdotNET.xhtml

...