Почему мои билеты проверки подлинности форм истекают так быстро?

Я использую проверку подлинности с помощью форм в приложении ASP.NET. Я настраиваю FormsAuthenticationTicket на истечение через 1 год, но на самом деле он истекает через 1 час или около того. Я не могу понять почему.

Вот весь код, участвующий в процессе входа в систему:

public static bool Login(int id)
{
    try
    {
        string securityToken = UserHelper.AuthenticateUser(id);

        DateTime expiryDate = DateTime.Now.AddYears(1);
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
             1, id.ToString(), DateTime.Now, expiryDate, true,
             securityToken, FormsAuthentication.FormsCookiePath);

        string encryptedTicket = FormsAuthentication.Encrypt(ticket);
        HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
        cookie.Expires = expiryDate;

        HttpContext.Current.Response.Cookies.Add(cookie);

        return true;
    }
    catch
    {
        return false;
    }
}

Web.config:

<system.web>
    <machineKey validationKey="AutoGenerate"
    decryptionKey="AutoGenerate" validation="SHA1" />
    <compilation debug="true">
    <authentication mode="Forms">
        <forms loginUrl="~/Login.aspx" timeout="2880"/>
    </authentication>
...

Что-то не так с моим подходом? Почему он так быстро истекает?

ИЗМЕНИТЬ

Код global.asax:

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    if (Request.PhysicalPath.EndsWith(".aspx") || Request.PhysicalPath.EndsWith(".axd") || Request.PhysicalPath.EndsWith(".ashx"))
        SecurityManager.SetPrincipal();
}

SetPrincipal код:

public static void SetPrincipal()
{
    ILivrePrincipal principal = null;
    FormsIdentity identity;
    UrlParameters urlParameters = UrlParametersHelper.GetUrlParameters(HttpContext.Current.Request);

    if (HttpContext.Current.Request.IsAuthenticated)
    {
        identity = (FormsIdentity)HttpContext.Current.User.Identity;

        User userProfile;
        urlParameters.SecurityToken = (((FormsIdentity)identity).Ticket).UserData;
        try
        {
            userProfile = UserHelper.GetUser(urlParameters.SecurityToken);
            UserHelper.UpdateLastActiveOn(userProfile);
            principal = new AuthenticatedPrincipal(identity, userProfile);
        }
        catch
        {
            //TODO: Log an exception
            FormsAuthentication.SignOut();
            principal = new AnonymousPrincipal(new GuestIdentity(), UserHelper.GetUser(null));
        }
    }
    else
    {
        principal = new AnonymousPrincipal(new GuestIdentity(), UserHelper.GetUser(null));
    }

    HttpContext.Current.User = principal;
}

person André Pena    schedule 03.07.2010    source источник
comment
Почему у вас timeout="2880" (где указано 2 дня)?   -  person Gabe    schedule 03.07.2010
comment
@Gabe Спасибо. Я согласен с тобой. Это ошибка, но она все еще не объясняет, почему срок моего сеанса входа в систему истекает примерно через час.   -  person André Pena    schedule 03.07.2010


Ответы (5)


Это твоя проблема.

<machineKey validationKey="AutoGenerate" 
            decryptionKey="AutoGenerate" 
            validation="SHA1"/>

ASP будет генерировать новый машинный ключ каждый раз при перезапуске пула приложений. Что могло происходить каждый час.

Машинный ключ используется для шифрования и дешифрования вашего файла cookie FormsAuthentication. Если он изменится, cookie в вашем браузере больше не работает. Таким образом, система будет относиться к вам так, как будто вы никогда не входили в систему.

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

<machineKey  
    validationKey="21F090935F6E49C2C797F69(snip)F1B72A7F0A281B"          
    decryptionKey="ABAA84D7EC4BB56D75D(snip)B8BF91CFCD64568A145BE59719F"
    validation="SHA1"
    decryption="AES"
/>

Создайте себе ключ здесь.

person John Wu    schedule 12.10.2013

Я не вижу ничего плохого в коде. Какой браузер вы используете, возможно, он не распознает срок годности 1 год? Я бы посмотрел на заголовки ответов с помощью скрипачки или другого подобного инструмента и посмотрел, что на самом деле отправляется.

person matt-dot-net    schedule 03.07.2010
comment
У меня проблема с любым браузером - person André Pena; 03.07.2010
comment
и как выглядит заголовок ответа? - person matt-dot-net; 03.07.2010
comment
Я согласен, что в первую очередь нужно посмотреть необработанные файлы cookie / трафик. Firefox с плагинами Firebug и Firecookie - отличный способ разобраться в ситуации (именно так я отлаживал свои проблемы с аутентификацией с помощью форм). - person RQDQ; 06.07.2010

Это может помочь http://support.microsoft.com/kb/910439/

Я предполагаю, что срок действия cookie истекает раньше, чем билет. В приведенной выше статье показаны способы отладки, чтобы убедиться, что это действительно так.

person shookdiesel    schedule 06.07.2010

Единственное, что я вижу нестандартно, - это то, что вы передаете id.ToString () конструктору FormsAuthenticationTicket. Обычно я передаю имя пользователя в этом параметре. Не уверен, будет ли это иметь значение, но попробовать стоит.

person Daniel Dyson    schedule 03.07.2010

Используете ли вы в своем приложении что-нибудь еще, что может вызвать тайм-аут? Автоматический выход из системы, например, при истечении внутрипроцессного состояния сеанса.

Я предполагаю, что у вас есть код в вашем Global.asax для обработки аутентифицированного запроса?

person Damien Dennehy    schedule 03.07.2010
comment
Не думаю, что использую что-то, что могло бы вызвать тайм-аут. Я добавил дополнительную информацию о коде аутентификации. - person André Pena; 03.07.2010