2015-04-28 4 views
4

У меня проблемы с использованием постоянного AuthCookie. Проверка и логин прекрасно работают, и если я закрываю браузер и повторно открываю его, аутентификация по-прежнему действительна, переадресация на страницу входа не выполняется. Я не уверен, что такое точное время, но скажем, что если закрыть браузер без выхода из системы и только повторно открыть его через 20 минут, я буду перенаправлен на страницу входа, даже если cookie установлен, когда я проверяю с веб-разработчиком инструментов, и срок его действия истекает через месяц.Постоянный AuthCookie настроен, но перенаправляется на вход

Все, что я делаю после проверки учетных данных пользователей является

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

И в моем Web.Config он у меня установлен как

<configuration> 
    <system.web> 
    ... 
    <authentication mode="Forms"> 
     <forms cookieless="UseCookies" loginUrl="~/Utilizador/Login" name="SMOAuth" slidingExpiration="true" timeout="43829"/> 
    </authentication> 
    ... 

также попытался жестко закодировать ключ машины, как предложил here и несколько других мест, но никакого эффекта

<machineKey validationKey="Validation_Key_Here" decryptionKey="Decrypt_Key_Here" validation="SHA1" decryption="AES"/> 

Я имею трудно определить это значение

ответ

4
//this line is NOT ENOUGH for "remember me" to work!!! 
FormsAuthentication.SetAuthCookie(userName, true); //DOESN'T WORK! 

//########### 

//you have to save the "remember me" info inside the auth-ticket as well 
//like this: 

DateTime expires = DateTime.Now.AddDays(20); //remember for 20 days 

//create the auth ticket 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, 
    userName, 
    DateTime.Now, 
    expires, // value of time out property 
    true, // Value of IsPersistent property!!! 
    String.Empty, 
    FormsAuthentication.FormsCookiePath); 

//now encrypt the auth-ticket 
string encryptedTicket = FormsAuthentication.Encrypt(ticket); 

//now save the ticket to a cookie 
HttpCookie authCookie = new HttpCookie(
      FormsAuthentication.FormsCookieName, 
      encryptedTicket); 
authCookie.Expires = expires; 

//feed the cookie to the browser 
HttpContext.Current.Response.Cookies.Add(authCookie); 
1

Проверьте настройки IIS.

1) По умолчанию IIS 7 (и IIS 8, а также в случае использования памяти) генерирует уникальный encryption key для каждого пула приложений во время выполнения. Генерация во время выполнения означает, что ключ восстанавливается при перезапуске пула приложений. Значение постоянного cookie, сгенерированного до перезапуска пула приложений, не будет дешифровано после перезапуска пула приложений, пользователь не сможет аутентифицироваться со старым файлом cookie и будет отправлен на страницу входа в систему.

2) IIS имеет значение по умолчанию idle timeout - 20 минут. Это означает, что если приложение не получит один запрос за 20 минут, пул приложений отключится. Затем он начнется заново, когда поступит запрос.

Комбинация вышеуказанных двух настроек может привести к описанному вами поведению.

PS. вам также может потребоваться проверить журнал событий приложения - если он действительно дешифрует сбой, у вас будет исключение - что-то в строках «Не удалось проверить данные»

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