由于某种原因,我的身份验证cookie的UserData属性为空。这是代码:
var authCookie = FormsAuthentication.GetAuthCookie(userName, rememberUser.Checked);
// Get the FormsAuthenticationTicket out of the encrypted cookie
var ticket = FormsAuthentication.Decrypt(authCookie.Value);
// Create a new FormsAuthenticationTicket that includes our custom User Data
var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, "userData");
// Update the authCookie's Value to use the encrypted version of newTicket
authCookie.Value = FormsAuthentication.Encrypt(newTicket);
// Manually add the authCookie to the Cookies collection
Response.Cookies.Add(authCookie);
FormsAuthentication.RedirectFromLoginPage(userName, rememberUser.Checked);
以下是我尝试访问它的方法:
if (HttpContext.Current.Request.IsAuthenticated )
{
var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
string data = authTicket.UserData;
// data is empty !!!
}
}
答案 0 :(得分:7)
RedictFromLoginPage
会覆盖您的Cookie。删除此行并手动重定向(Response.Redirect
)。
答案 1 :(得分:3)
这是我几天前回答的类似答案。
https://stackoverflow.com/a/16365000/296861
如果您自己创建 FormsAuthenticationTicket ,则无法使用 FormsAuthentication.SetAuthCookie 或 FormsAuthentication.RedirectFromLoginPage 。
答案 2 :(得分:0)
<authentication mode="Forms">
<forms slidingExpiration="true" timeout="60" cookieless="UseUri"/>
</authentication>
如果你有cookieless =&#34; UseUri&#34;在你的网络配置中删除它.. 它适用于我的情况
答案 3 :(得分:0)
FormsAuthenticationTicket
可能会以空的UserData
值结束的另一个原因-这导致通过在身份验证票证上调用FormsAuthentication.Encrypt
生成的加密身份验证令牌也为空-如果null
被指定为FormsAuthenticationTicket
constructor的userData
参数的值。
如果您没有要在身份验证票证上设置的特殊用户数据,请使用空字符串代替null
作为参数。
也就是说,而不是:
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
myAuthenticationTicketVersion,
authenticatedUserName,
DateTime.Now,
myExpirationDate,
true,
null); // The null value here causes the problem
改为执行此操作:
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
myAuthenticationTicketVersion,
authenticatedUserName,
DateTime.Now,
myExpirationDate,
true,
""); // Ok