Кажется, перестает работать cookie для проверки подлинности с помощью форм - PullRequest
0 голосов
/ 26 октября 2009

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

Код, который у меня есть для решения этой проблемы:

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 Ответ

1 голос
/ 26 октября 2009

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

...