2

我正在调用存储过程来更改用户名。这有效,并且用户名已更改。

更改用户名后,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);
}

然后我尝试Membership.ValidateUser(username,password)在调用 Authorize 函数之前添加(因为它是一个测试帐户并且我知道密码)但它没有任何区别。

然后我尝试了这个:

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. 如果您正在调用使用用户名的 Membership.GetUser() 重载之一并且它返回 null,那么该用户在 Membership 数据源中不存在(或者我们有一个错误)。轻松验证这一点的一种方法是尝试使用相同用户名的 Membership.CreateUser()。如果这不会因为重复用户而引发错误,那么您就知道该用户从一开始就不存在。

  3. Membership.GetUser() 不应该为匿名用户工作。会员资格中没有内置任何支持来处理此案例。

4

1 回答 1

0

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

您可以手动将 User.Identity 替换为您自己的主体,但这需要实现您自己的成员资格提供程序。

于 2013-10-09T15:48:31.200 回答