好的,首先我只想说出我想要做的事情已证明是真正的PITA。我遇到的问题类似于以下帖子:
ASP.NET Identity check user roles is not working
Updating user role using asp.net identity
public async Task<ActionResult> MyAccount()
{
var userId = User.Identity.GetUserId();
var user = await UserManager.FindByIdAsync(userId);
if (!User.IsInRole(RoleConst.EXPIRED))
{
await UserManager.AddToRoleAsync(userId, RoleConst.EXPIRED);
await SignInAsync(user, false);
}
var isExpired = User.IsInRole(RoleConst.EXPIRED); // FALSE!!
return View(model);
}
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
var authenticationManager = HttpContext.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie);
authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, await user.GenerateUserIdentityAsync(UserManager));
}
即使在使用登录方法刷新cookie后,该角色也不会像其他一些用户建议的那样更新。当然,角色在db中更新。
此代码在更新后检查角色时有效:
var isExpired = UserManager.IsInRole(userId, RoleConst.EXPIRED);
我想我会好的,但是,我需要在剃须刀后立即进行检查。我还没有找到如何在控制器外部使用UserManger。对这个看似简单的任务的任何建议将不胜感激!
修改
我也尝试了以下产生相同结果:
await UserManager.AddToRoleAsync(user.Id, RoleConst.EXPIRED);
await UserManager.UpdateSecurityStampAsync(user.Id);
var isExpired = User.IsInRole(RoleConst.EXPIRED); // FALSE
答案 0 :(得分:1)
一旦您退出并再次登录(这不是用户友好的选项),它将起作用
所以试试这个(重新排序这些行),
await this.UserManager.AddToRoleAsync(user.Id, model.UserRole);
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
这样只有在添加用户角色后才能存储cookie。 :)
答案 1 :(得分:0)
相关问题中的一个人建议您再次登录并重新登录,您甚至不会这样做:只需登录即可。但是,在其中一条评论中,您可以找到link to the answer you need。您需要致电多长时间:
UserManager.UpdateSecurityStampAsync(userId);
更改用户角色后。