ASP.NET身份而不是“节省”;更新的要求

本文关键字:更新 节省 身份 NET ASP | 更新日期: 2023-09-27 18:03:01

长话短说,我使用Identity,在我的解决方案中,我创建了一个自定义帐户设置页面,它工作得很好。问题是我在_Layout.cshtml中有用户FirstNameLastName。名称是由我的自定义助手方法设置的:

public static MvcHtmlString GetUsersFirstAndLastName(this HtmlHelper helper)
{
   string fullName = HttpContext.Current?.User?.Identity?.Name ?? string.Empty;
   var userIdentity = (ClaimsPrincipal)Thread.CurrentPrincipal;
   var nameClaim = identity?.FindFirst("fullname");
   if (nameClaim != null)
   {
       fullName = nameClaim.Value;
   }
   return MvcHtmlString.Create(fullName);
}

这个方法非常有效,直到用户进入他们的配置文件并更新他们的名字。如果他们将名称从George更改为Bob,那么当他们在我的网站上四处走动时,此方法仍然将其名称拉为George,直到他们退出并重新登录。

所以我所做的是解决这个问题,当他们在帐户设置中更新他们的名字时,我添加了一些代码来删除他们的旧fullName声明,并添加新的,像这样:

var identity = User.Identity as ClaimsIdentity;
// check for existing claim and remove it
var currentClaim = identity.FindFirst("fullName");
if (currentClaim != null)
   identity.RemoveClaim(existingClaim);
// add new claim
var fullName = user.FirstName + " " + user.LastName;
identity.AddClaim(new Claim("fullName", fullName));
通过这段代码,_Layout视图现在更新了名称(在前面的示例中,George现在将更改为Bob)。然而,当点击离开该视图到网站上的另一个地方或刷新页面时,它会立即变回George

仍然是一个有点新的身份,我有点困惑为什么这个新的更新的声明不工作后,他们点击到不同的页面或刷新。任何帮助都是感激的。:)

ASP.NET身份而不是“节省”;更新的要求

当添加新的声明时,您还需要这样做:

    var authenticationManager = HttpContext.GetOwinContext().Authentication;
    authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(identity), new AuthenticationProperties() { IsPersistent = true });
所以新的完整代码块是:
public static MvcHtmlString GetUsersFirstAndLastName(this HtmlHelper helper)
{
    string fullName = HttpContext.Current?.User?.Identity?.Name ?? string.Empty;
    var userIdentity = (ClaimsPrincipal)Thread.CurrentPrincipal;
    var nameClaim = identity?.FindFirst("fullname");
    var authenticationManager = HttpContext.GetOwinContext().Authentication;
    authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(identity), new AuthenticationProperties() { IsPersistent = true });
    if (nameClaim != null)
    {
        fullName = nameClaim.Value;
    }
    return MvcHtmlString.Create(fullName);
}