2009-10-26 3 views
0

Я хочу иметь функциональность в своем приложении, которая позволяет пользователю проверить, что они хотят оставаться в журнале неограниченно (произвольно устанавливая срок действия файла cookie через 3 месяца с момента СЕЙЧАС).Forms Authentication cookie, похоже, перестает работать

код у меня есть для работы с этим

private static HttpCookie GetFormsAuthenticationCookie(string userNameResponse, 
                 bool persistCookie) 
{    
    var cookie = FormsAuthentication.GetAuthCookie(userNameResponse, persistCookie); 

    if (persistCookie) 
     cookie.Expires = DateTime.Now.AddMonths(3); 

    return cookie; 
} 

private void LoginUser(string userNameResponse, bool PersistCookie) 
{ 
    Response.Cookies.Add(GetFormsAuthenticationCookie(userNameResponse, PersistCookie)); 

    string navigateAfterUrl = FormsAuthentication.GetRedirectUrl(userNameResponse, 
                   PersistCookie); 

    Response.Redirect(navigateAfterUrl); 
} 

Однако в каком-то момент позже, когда я вернусь на сайт, мне нужно снова войти в системе. Я подтвердил, что cookie возвращается с моей датой истечения срока действия и что он не установлен как cookie сеанса (также проверяется с закрытием/повторным открытием браузера, а файл cookie все еще существует). Я думаю, что это имеет какое-то отношение к тому, когда ASP.NET заканчивает сеанс.

У меня есть конкретная установка машинного ключа в моем web.config, поэтому не должен работать тот же файл cookie, если IIS перезагружается и т. Д.? Есть ли у кого-нибудь какие-либо предложения о том, что может быть причиной этого или по крайней мере на том, как проследить это дальше, поскольку я не могу думать о чем-то другом.

ответ

1

При вызове метода GetAuthCookie создается FormsAuthenticationTicket с таймаутом, заданным Timeout в web.config. Так что не забудьте установить его правильно:

<authentication mode="Forms"> 
    <forms 
    loginUrl="/someloginUrl" 
    requireSSL="true" 
    protection="All" 
    // This is the setting you are looking for! (it's in seconds) 
    timeout="120" 
    domain="example.com" 
    slidingExpiration="false" 
    name="cookieName" /> 
</authentication> 

После того, как билет зашифрован он используется в качестве значения для печенья. Когда вы устанавливаете свойство вашего файла cookie Expires на заданное значение, это указывает на то, что он будет сохраняться на клиентском компьютере за данный период. Затем при каждом запросе среда выполнения ASP.NET проверяет наличие файла cookie, попытается расшифровать значение и получить билет. Затем он проверяет, действительно ли билет действителен, используя свойство Timeout, поэтому, если у вас есть небольшой тайм-аут, независимо от того, что ваш файл cookie все еще передан, билет больше недействителен и аутентификация не будет выполнена.

+0

Так что же такое компромисс, если я установил тайм-аут на 3 * 30 * 24 * 60? То, что пользователь, который не хочет оставаться в системе, никогда не будет простаивать с нашего сайта, пока они не закроют браузер, и файл cookie сеанса не будет удален? –

+0

Даже если пользователь закрывает браузер, если вы настроите постоянный файл cookie (свойство Expires), он не выйдет из системы. Но если вы вызовете метод FormsAuthentication.SignOut', cookie будет признан недействительным. –

+0

Я имел в виду пользователя, который не хочет оставаться в системе, поскольку cookie не настроен на постоянство. –

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