FormsAuthentication не сохраняет поле UserData после обратной передачи в .NET 3.5 - PullRequest
2 голосов
/ 08 сентября 2010

Я создал 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!

Есть идеи?

Ответы [ 3 ]

9 голосов
/ 08 сентября 2010

Я думаю, что нашел проблему. Если вы создадите собственное имя файла cookie, это будет хорошо! Итак, измените с:

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 делает некоторые хитрые вещи с ним, поэтому, вставив его в новый, отлично работает.

UPDATE:

Кроме того, билет необходимо обновить, в противном случае срок действия билета истечет, пока пользователь использует веб-сайт:

FormsAuthentication.RenewTicketIfOld(ticket); // Do before saving cookie
1 голос
/ 12 июля 2012

Я также столкнулся с этой проблемой.Но я думаю, что настоящая причина в том, что сервер дважды устанавливает один и тот же файл cookie, а второй переопределяет первый, содержащий ваше поле UserData.

Вы можете зафиксировать процесс записи файлов cookie с помощью Fiddler, и вот снимок экрана, на котором показана эта проблема: enter image description here

Итак, как это произошло?В моей ситуации я использую элемент управления Login для аутентификации.В событии Authenticate элемента управления Login я установил cookie с моими UserData после проверки имени пользователя и пароля вручную.Затем я установил AuthenticateEventArgs.Authenticated=true, в это время в окне отладки я вижу, что новый файл cookie ставится в очередь к ответу, имя которого также равно FormsAuthentication.FormsCookieName!Мое решение - перенаправить на страницу по умолчанию вместо установки AuthenticateEventArgs.Authenticated = true.

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

1 голос
/ 06 июня 2011

Это работает для меня:

//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);
...