2010-07-03 8 views
10

Я использую проверку подлинности форм в приложении 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> 
... 

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

EDIT

код 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; 
} 
+2

Почему у вас есть 'timeout =" 2880 "' (который определяет 2 дня)? – Gabe

+0

@Gabe Спасибо. Я согласен с тобой. Это ошибка, но до сих пор не объясняет, почему мой сеанс регистрации истекает примерно через час. –

ответ

7

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

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

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

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

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

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

Сформировать себе ключ here.

1

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

+0

У меня проблема с любым браузером –

+0

и как выглядит заголовок ответа? –

+1

Я согласен с тем, что первое, что нужно посмотреть, - это сырые файлы cookie/трафик. Firefox с плагинами Firebug и Firecookie - отличный способ разобраться в ситуации (вот как я отлаживал свои проблемы с помощью проверки подлинности форм). – RQDQ

0

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

0

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

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

+0

Я не думаю, что я использую все, что может вызвать таймаут. Я добавил дополнительную информацию об аутентификационном коде. –

1

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

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

Смежные вопросы