我正在调用存储过程来更改用户名。这有效,用户名也会更改。
更改用户名后,Membership.GetUser()
返回null。我检查User.Identity
它仍然有旧的用户名并经过身份验证。
首先我尝试调用此函数(当用户首次登录时也调用该函数)
public void Authorize(string username)
{
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddDays(5), true, string.Empty);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
authCookie.Expires = authTicket.Expiration;
HttpContext.Current.Response.Cookies.Add(authCookie);
}
然后我在调用Authorize函数之前尝试添加Membership.ValidateUser(username,password)
(因为它是一个测试帐户而且我确实知道了密码),但它没有任何区别。
然后我尝试了这个:
FormsAuthentication.SignOut();
FormsAuthentication.SetAuthCookie(txtUserName.Text, false);
我很困惑,在致电FormsAuthentication.SignOut()
后,User.Identity.IsAuthenticated
仍然是真的。这是不应该在页面重新加载之后更新?
我读了这个http://forums.asp.net/t/939408.aspx/1,这让我觉得我的问题是User.Identity.Name
永远不会更新。我该如何做到这一点?
Membership.GetUser()仅适用于经过身份验证的用户。否则,它将返回null。要验证您是否正在处理经过身份验证的请求,请在页面上调用“User.Identity.IsAuthenticated”。如果您有经过身份验证的请求,但Membership.GetUser()仍然返回null,则表示在Membership数据源中找不到与经过身份验证的用户关联的用户名。使用“User.Identity.Name”验证经过身份验证的用户的用户名。
如果你正在调用其中一个Membership.GetUser()重载,它接受用户名并返回null,那么该用户在Membership数据源中不存在(或者我们有一个bug)。轻松验证这一点的一种方法是尝试使用相同用户名的Membership.CreateUser()。如果由于用户重复而没有引发错误,那么您就知道该用户从未存在过。
- 醇>
Membership.GetUser()应该从未为匿名用户工作过。在处理此案件时,会员资格没有内置支持。
答案 0 :(得分:0)
在下一个请求之前,对FormsCookie用户帐户的任何更改都不会反映在User.Identity属性中。在验证cookie时,此属性由成员提供程序在请求开始时设置。您所做的任何更改都将在随后的任何请求中看到。
您可以手动将User.Identity替换为您自己的主体,但这需要实施您自己的会员提供商。