Кажется, перестает работать cookie для проверки подлинности с помощью форм

StackOverflow https://stackoverflow.com/questions/1626924

Вопрос

Я хочу, чтобы в моем приложении была функциональность, позволяющая пользователям отмечать, что они хотят оставаться в журнале бесконечно (произвольно устанавливая срок действия файла 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 и т. д.? Есть ли у кого-нибудь какие-либо предложения относительно того, что может быть причиной этого или, по крайней мере, как отследить это дальше, так как я не могу придумать, что еще делать.

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top