FormandauthAuthentication не сохраняет поле UserData после отложения в .NET 3.5
-
01-10-2019 - |
Вопрос
Я создал А. FormsAuthenticationTicket
с нуля, но обнаружил, что при извлечении его в более позднее время UserData
не возвращается. Вот код используется:
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,
user.UserId,
DateTime.Now,
DateTime.MaxValue,
false,
user.UserType);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(ticket));
Response.Cookies.Add(cookie);
Однако при чтении этого обратно на следующий Request
, Я обнаружил, что UserData
поле сейчас пусто:
string encryptedCookie = Request.Cookies[ FormsAuthentication.FormsCookieName ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsTrue( ticket.UserData.Length == 0 ); //TRUE!
Есть идеи?
Решение
Я думаю, что нашел проблему. Если вы составляете свое собственное имя печенья, кажется, в порядке! Так меняется из:
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(ticket));
к
HttpCookie cookie = new HttpCookie(
"SiteCookie",
FormsAuthentication.Encrypt(ticket));
А затем извлечь его согласно вопросу:
string encryptedCookie = Request.Cookies[ "SiteCookie" ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsFalse( ticket.UserData.Length == 0 ); //Hooray! It works
Еще возможным .NET.
ОБНОВИТЬ:
Кроме того, билет должен быть обновлен, поскольку в противном случае билет истекает, пока пользователь использует сайт:
FormsAuthentication.RenewTicketIfOld(ticket); // Do before saving cookie
Другие советы
Это работает для меня:
//Create Form Authentication ticket
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, currentUser.userid.ToString(), DateTime.Now, DateTime.Now.AddMinutes(60), false, currentUser.ToString(), FormsAuthentication.FormsCookiePath);
string hashCookies = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashCookies);
cookie.HttpOnly = true;
HttpContext.Current.Response.Cookies.Add(cookie);
Я также столкнулся с этой проблемой. Но я думаю, что настоящая причина в том, что сервер устанавливает одинаковое cookie дважды, а второе переопределяйте первый, который содержит ваше поле userdata.
Вы можете захватить процесс написания Cookie Fiddler, и вот скриншот, который показывает эту проблему:
Итак, как это произошло? В моей ситуации я использую управление логином для аутентификации. В случае аутентификационного события управления входа в систему, я установил cookie с помощью my userdata после проверки имени пользователя и пароля manully. Тогда я установил AuthenticateEventArgs.Authenticated=true
, В это время в окне отладки я вижу, что новое cookie поставило в очередь к ответу, которое имя также равно формам formsauthentication.formscokiename! Мое решение перенаправляется на страницу по умолчанию вместо настройки аутентификацииEventargs.authenticated = True.
Таким образом, вы можете отладить свой код, чтобы увидеть, если файл cookie аутентификации в два раза дважды.