AddToRole不更新用户角色

时间:2015-11-10 19:24:14

标签: asp.net-mvc razor identity

好的,首先我只想说出我想要做的事情已证明是真正的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

2 个答案:

答案 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);

更改用户角色后。