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