在.NET 3.5中回发后,FormsAuthentication不保留UserData字段

时间:2010-09-08 15:15:04

标签: asp.net cookies formsauthentication

我从头开始创建了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 个答案:

答案 0 :(得分:9)

我想我发现了这个问题。如果你自己编写了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做了一些棘手的事情,所以把它放在一个新的工作正常。

更新:

此外,需要刷新票证,否则票证将在用户使用网站时到期:

FormsAuthentication.RenewTicketIfOld(ticket); // Do before saving cookie

答案 1 :(得分:1)

这对我有用:

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

答案 2 :(得分:1)

我也遇到过这个问题。 但我认为真正的原因是服务器设置相同的cookie两次,第二次覆盖包含UserData字段的第一个。

您可以捕获Fiddler的cookie编写过程,这是一个显示此问题的屏幕截图: enter image description here

那么,这是怎么发生的?在我的情况下,我使用Login控件进行身份验证。在Login控件的Authenticate事件中,我在检查了用户名和密码manaully之后用我的UserData设置了cookie。然后,我在调试窗口中设置AuthenticateEventArgs.Authenticated=true,此时我看到一个新的cookie排队到响应,该名称也等于FormsAuthentication.FormsCookieName!我的解决方案是重定向到Default页面,而不是设置AuthenticateEventArgs.Authenticated = true。

因此,您可以调试代码以查看身份验证cookie是否排队等待响应两次。