修改后使 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中。
我正在使用 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中。