修改后使 ClaimsPrincipal 无效

Invalidate ClaimsPrincipal after it has been modified

我正在使用 ASP.NET MVC,Identity2。

我已添加 "FirstName" 自定义 ClaimPrincipal:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, long> manager)
{
    var userIdentity = await manager.CreateIdentityAsync(
                           this,
                           DefaultAuthenticationTypes.ApplicationCookie);

    // Add custom user claims here
    userIdentity.AddClaim(new Claim("FirstName", FirstName));

    return userIdentity;
}

如果我更新 "FirstName" 的值,我需要注销并重新登录,以便更新 "FirstName" 声明。是否可以使 "FirstName" 声明无效,因此它的值被强制刷新?


我看过 this question,它展示了如何更新 Claims 的值,我想知道是否有更简单的方法来使它们无效。

在查看 MS 内置模板时,我注意到他们总是在更改用户凭据(例如密码、2 因素身份验证等)后调用 SignInManager.SignInAsync

我还注意到,一旦用户注销并重新登录,Claims 就会更新...所以在更改存储在 Claim 中的 "FirstName" 之后,我调用了SignInManager.SignInAsync 重新登录用户...这样,Claims 就会更新:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> UpdateFirstName(string firstName)
{
    var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<long>());
    user.FirstName = firstName;

    // update FirstName which is stored in a Claim
    var result = await UserManager.UpdateAsync(user);

    if (result.Succeeded)
    {
        // re-signin the user, to refresh the Claims
        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

        // you need to redirect after calling SignInAsync, so claims are refreshed
        return RedirectToAction("Index"); 
    }

    // add some error message...
    return View();
}

注意:如问题所示,我将Claims存储在Cookie中。