通过sql更改ASPNETDB用户名后,User.Identity不更新

时间:2013-07-24 19:07:43

标签: webforms forms-authentication aspnetdb

我正在调用存储过程来更改用户名。这有效,用户名也会更改。

更改用户名后,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永远不会更新。我该如何做到这一点?

  
      
  1. Membership.GetUser()仅适用于经过身份验证的用户。否则,它将返回null。要验证您是否正在处理经过身份验证的请求,请在页面上调用“User.Identity.IsAuthenticated”。如果您有经过身份验证的请求,但Membership.GetUser()仍然返回null,则表示在Membership数据源中找不到与经过身份验证的用户关联的用户名。使用“User.Identity.Name”验证经过身份验证的用户的用户名。

  2.   
  3. 如果你正在调用其中一个Membership.GetUser()重载,它接受用户名并返回null,那么该用户在Membership数据源中不存在(或者我们有一个bug)。轻松验证这一点的一种方法是尝试使用相同用户名的Membership.CreateUser()。如果由于用户重复而没有引发错误,那么您就知道该用户从未存在过。

  4.   
  5. Membership.GetUser()应该从未为匿名用户工作过。在处理此案件时,会员资格没有内置支持。

  6.   

1 个答案:

答案 0 :(得分:0)

在下一个请求之前,对FormsCookie用户帐户的任何更改都不会反映在User.Identity属性中。在验证cookie时,此属性由成员提供程序在请求开始时设置。您所做的任何更改都将在随后的任何请求中看到。

您可以手动将User.Identity替换为您自己的主体,但这需要实施您自己的会员提供商。