ASP.NET身份而不是“节省”;更新的要求
本文关键字:更新 节省 身份 NET ASP | 更新日期: 2023-09-27 18:03:01
长话短说,我使用Identity,在我的解决方案中,我创建了一个自定义帐户设置页面,它工作得很好。问题是我在_Layout.cshtml
中有用户FirstName
和LastName
。名称是由我的自定义助手方法设置的:
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
。仍然是一个有点新的身份,我有点困惑为什么这个新的更新的声明不工作后,他们点击到不同的页面或刷新。任何帮助都是感激的。:)
当添加新的声明时,您还需要这样做:
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);
}