FormandauthAuthentication не сохраняет поле UserData после отложения в .NET 3.5

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

Вопрос

Я создал А. 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, и вот скриншот, который показывает эту проблему:enter image description here

Итак, как это произошло? В моей ситуации я использую управление логином для аутентификации. В случае аутентификационного события управления входа в систему, я установил cookie с помощью my userdata после проверки имени пользователя и пароля manully. Тогда я установил AuthenticateEventArgs.Authenticated=true, В это время в окне отладки я вижу, что новое cookie поставило в очередь к ответу, которое имя также равно формам formsauthentication.formscokiename! Мое решение перенаправляется на страницу по умолчанию вместо настройки аутентификацииEventargs.authenticated = True.

Таким образом, вы можете отладить свой код, чтобы увидеть, если файл cookie аутентификации в два раза дважды.

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