Подтвердить что ты не робот

Как установить Request.IsAuthenticated в true, если вы не используете FormsAuthentication.RedirectFromLoginPage?

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

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

FormsAuthentication.SetAuthCookie(username, false);

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

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

4b9b3361

Ответ 1

Вам необходимо обновить текущий ключ безопасности для запроса. Когда вы вызываете 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);
        }
    }
}

Ответ 2

FormsAuthentication.SetAuthCookie

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

Ссылка: msdn

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

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

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

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

Ответ 3

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

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

В этом случае вы можете reset значение 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

Ответ 4

мы можем использовать это просто

FormsAuthentication.SetAuthCookie (имя пользователя, true);