Asp.net mvc 修改后使ClaimsPrincipal无效
我正在使用ASP.NET MVC,Identity2 我添加了“FirstName”自定义Asp.net mvc 修改后使ClaimsPrincipal无效,asp.net-mvc,asp.net-mvc-4,claims-based-identity,asp.net-identity-2,Asp.net Mvc,Asp.net Mvc 4,Claims Based Identity,Asp.net Identity 2,我正在使用ASP.NET MVC,Identity2 我添加了“FirstName”自定义clainprincipal: public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, long> manager) { var userIdentity = await manager.CreateIdentityAsync(
clainprincipal
:
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;
}
public async Task GenerateUserIdentityAsync(UserManager,它显示了如何更新声明的值,我想知道是否有更简单的方法使它们失效。当查看MS内置模板时,我注意到它们在更改用户凭据后总是调用SignInManager.SignInAsync
(例如密码、双因素认证等)
我还注意到,一旦用户注销并重新登录,声明就会更新……因此,在更改存储在声明
中的“FirstName”后,我调用了SignInManager.SignInAsync来重新登录用户……这样,声明
就会更新:
[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();
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务UpdateFirstName(字符串名)
{
var user=await UserManager.FindByIdAsync(user.Identity.GetUserId());
user.FirstName=FirstName;
//更新索赔中存储的FirstName
var result=await UserManager.UpdateAsync(用户);
if(result.successed)
{
//重新登录用户,以刷新声明
等待SignInManager.SignInAsync(用户,isPersistent:false,rememberBrowser:false);
//您需要在调用SignInAsync后重定向,以便刷新声明
返回操作(“索引”);
}
//添加一些错误消息。。。
返回视图();
}
注意:如问题所示,我将声明存储在Cookie中。查看MS内置模板时,我注意到他们总是在更改用户凭据(例如密码、双因素身份验证等)后调用SignInManager.SignInAsync
我还注意到,一旦用户注销并重新登录,声明就会更新……因此,在更改存储在声明
中的“FirstName”后,我调用了SignInManager.SignInAsync来重新登录用户……这样,声明
就会更新:
[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();
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务UpdateFirstName(字符串名)
{
var user=await UserManager.FindByIdAsync(user.Identity.GetUserId());
user.FirstName=FirstName;
//更新索赔中存储的FirstName
var result=await UserManager.UpdateAsync(用户);
if(result.successed)
{
//重新登录用户,以刷新声明
等待SignInManager.SignInAsync(用户,isPersistent:false,rememberBrowser:false);
//您需要在调用SignInAsync后重定向,以便刷新声明
返回操作(“索引”);
}
//添加一些错误消息。。。
返回视图();
}
注意:如问题所示,我正在Cookie中存储声明
。技术解决方案取决于您的设置。如果您正在Cookie中存储信息,则需要更新Cookie。如果您使用的是访问令牌,则需要等待它过期或使用新的访问令牌(例如使用refres)替换它h token。逻辑解决方案是不包括经常更改或可以通过其他方式确定的声明。您可以设置UserInfo端点,在该端点中您可以请求当前的名字和有关用户的其他信息。但您也可以将其作为业务上下文的一部分,例如询问名字是什么。感谢@RuardvanElburg的解释声明。我使用Cookie,之所以将FirstName和LastName存储为声明,是因为我希望它们存储在Cookie中…我认为从Cookie中读取它们会比从DB中读取用户对象更快。FirstName和LastName不会经常更改…您认为,将它们保留为声明是明智的解决方案吗?它始终取决于nds取决于您的设计,但这是肯定的。可以使用诸如FirstName、LastName之类的声明。特别是当您希望在每个页面上显示它们时。这可能会更快,但我怀疑您是否能够实际测量差异。还有其他提高性能的方法,如缓存。技术解决方案取决于您的设置。如果您正在存储信息在cookie中单击“刷新”,则您需要更新cookie。如果您使用的是访问令牌,则您需要等待它过期,或者使用新的访问令牌(例如,使用刷新令牌)替换它。逻辑解决方案是不包括经常更改或可以通过其他方式确定的声明。您可以设置一个UserInfo终结点,在该终结点中可以查询用户的当前名字和其他信息。但你也可以将其作为业务上下文的一部分,比如询问名字是什么。感谢@RuardvanElburg的解释。我使用Cookie,我之所以将名字和姓氏存储为声明,是因为我希望它们存储在Cookie中……我想从cookie会比从数据库读取用户对象更快。FirstName和LastName不会经常更改…您认为,将它们保留为声明是一个明智的解决方案吗?这始终取决于您的设计,但确实如此。可以使用像FirstName、LastName这样的声明。特别是当您希望在每个页面上显示它们时。这可能会更快,但我怀疑您可以实际测量差异。还有其他提高性能的方法,如缓存。