ASP.NET: почему FormsAuthenticationTicket обнуляется после истечения времени ожидания аутентификации - PullRequest
2 голосов
/ 20 декабря 2010

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

public class AuthenticationModule : IHttpModule
{
    #region IHttpModule Members
    void IHttpModule.Dispose() { }
    void IHttpModule.Init(HttpApplication application)
    {
        application.AuthenticateRequest += new EventHandler(this.context_AuthenticateRequest);
    }
    #endregion


    /// <summary>
    /// Inspect the auth request...
    /// </summary>
    /// <remarks>See "How To Implement IPrincipal" in MSDN</remarks>
    private void context_AuthenticateRequest(object sender, EventArgs e)
    {
        HttpApplication a = (HttpApplication)sender;
        HttpContext context = a.Context;

        // Extract the forms authentication cookie
        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = context.Request.Cookies[cookieName]; // no longer a forms cookie in this array once timeout has expired

        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            DateTime expirationTime = authTicket.Expiration;
            // check if previously authenticated session is now dead
            if (authTicket != null && authTicket.Expired)
            {
                // send them a Response indicating that they've expired.
            }
        }
    }
}

Проблема в том, что по истечении периода аутентификации (я установил его на 1 мин для проверки), cookie форм больше не существует (см. Комментарий в коде). Это означает, что cookie-файл аутентификации будет нулевым, и я не смогу пройти проверку на нулевое значение в моем коде. Но есть удобное свойство «Expired» для FormsAuthenticationTicket, которое, как мне кажется, должно проверять, истек ли период. Но как мне зайти так далеко, если куки больше нет? Разумно ли предположить, что период аутентификации истек, если файлов cookie форм больше нет?

Любая помощь будет оценена по этому вопросу.

Ответы [ 3 ]

0 голосов
/ 02 августа 2011

Если для FormsAuthenticationTicket установлено значение false для isPersistent, тогда постоянный файл cookie не устанавливается. Когда срок действия билета истекает, cookie не отправляется вместе с запросом, поэтому вы не можете получить к нему доступ.

0 голосов
/ 05 декабря 2012

Это поведение контролируется модулем System.Web.Security.FormsAuthenticationModule.Этот модуль проверяет, не истек ли срок действия билета, и в этом случае удаляет cookie.

Обратите внимание, что этот модуль проверяет параметр slideExpiration и, если требуется, обновляет билет.

Итак, вернемся к вашему вопросу:

Разумно ли предположить, что период аутентификации истек, если файлов cookie форм больше нет?

Ответ, на мой взгляд, положительный.

0 голосов
/ 20 декабря 2010

Возможно, вы захотите попробовать что-то вроде этого:

if (User != null)
        {
            FormsIdentity id = (FormsIdentity)User.Identity;
            FormsAuthenticationTicket ticket = id.Ticket;
            if (ticket.Expired)
            {
               //do something
            }
        }

Подробнее

Редактировать:

1: Я вижу, что пользователь будет нулевым. Поэтому использование User.Identity не подлежит обсуждению.

2: Как насчет того, чтобы попробовать код, который у вас есть в исходном вопросе в событии BeginRequest вместо AuthenticateRequest.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...