我从头开始创建了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!
有什么想法吗?
答案 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编写过程,这是一个显示此问题的屏幕截图:
那么,这是怎么发生的?在我的情况下,我使用Login控件进行身份验证。在Login控件的Authenticate事件中,我在检查了用户名和密码manaully之后用我的UserData设置了cookie。然后,我在调试窗口中设置AuthenticateEventArgs.Authenticated=true
,此时我看到一个新的cookie排队到响应,该名称也等于FormsAuthentication.FormsCookieName!我的解决方案是重定向到Default页面,而不是设置AuthenticateEventArgs.Authenticated = true。
因此,您可以调试代码以查看身份验证cookie是否排队等待响应两次。