如何在ASP.NET MVC 5中更改和应用当前用户的角色

时间:2018-12-25 22:25:23

标签: asp.net-mvc roles authorize isinrole

我将首先介绍导致角色授权问题的步骤。

首先,我在HomeController.cs的委托人中添加2个角色

public HomeController()
{
    _db = new ApplicationDbContext();
    _roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(_db));
    _userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));
    List<string> roles = new List<string>()
    {
        "User", "Admin"
    };
    foreach(string role in roles)
    {
        if (!_roleManager.RoleExists(role))
        {
            _roleManager.Create(new IdentityRole(role));
        }
    }
}

角色已成功添加到数据库中。

然后我在AccountController.cs的注册任务中为新的注册用户添加角色

...
if (result.Succeeded)
{
    await UserManager.AddToRoleAsync(user.Id, "User");
...

角色User已成功分配给新用户(在表AspNetUserRoles中)

然后,如果我将用户角色更改为Admin

string userId = User.Identity.GetUserId<string>();
_userManager.RemoveFromRole(userId, "User");
_userManager.AddToRole(userId, "Admin");

然后在我的视图(剃刀)中检查它,如下所示:

@if(User.IsInRole("Admin"))
{
   <p> ok </p>
}

然后通过[Authorize(Roles = "Admin")]在我的HomeController中对其进行检查。

然后失败两次。 if(User.IsInRole("Admin"))返回false,而[Authorize(Roles = "Admin")]也不允许我访问其下面的方法。

此外,这个新注册的用户仅具有User的角色,因为[Authorize(Roles = "User")]起作用并且if(User.IsInRole("User"))也返回true。

奇怪的是IList<string> roles

    string userId = User.Identity.GetUserId<string>();
    IList<string> roles = _userManager.GetRoles(userId);

通过_userManager.AddToRole(userId, "Admin");添加新角色时,实际上正确地返回了新角色列表,因此具有默认角色User的用户现在只有1个角色Admin(因为我删除了先前的角色),这似乎很合理而且有效。

如果您知道为什么我的默认角色User不能像上面那样发布您的答案的方式进行更改,谢谢。

1 个答案:

答案 0 :(得分:0)

要在用户角色替换中应用更改,此用户应重新登录。 基本上说我们有一个名为UserService

的服务
public class UserService
{
    private ApplicationDbContext _db;
    private ApplicationUserManager _userManager;
    private ApplicationSignInManager _signInManager;

    public UserService()
    {
        _db = new ApplicationDbContext();
        _userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));
        IOwinContext owinContext = HttpContext.Current.GetOwinContext();
        _signInManager = new ApplicationSignInManager(_userManager, owinContext.Authentication);
    }

    public async Task SaveRole()
    {
        ApplicationUser user = _userManager.FindById(HttpContext.Current.User.Identity.GetUserId());
        await _signInManager.SignInAsync(user, true, true);
    }
}

为用户分配角色后,我们需要调用SaveRole()任务以更新身份验证cookie以使其与数据库保持最新。

public class HomeController : Controller
{
    private UserService _userService;

    public HomeController()
    {
        _userService = new UserService();
    }

    public async Task<ActionResult> ApplyRole()
    {
        await _userService.SaveRole();
        return RedirectToAction("JustTestRole", "Home");
    }
}

现在在视图(.cshtml)中调用ApplyRole任务:

<li>@Html.ActionLink("Apply role", "ApplyRole", "Home")</li>

当前用户角色已应用并可以进行测试。例如:

[Authorize(Roles = "Admin")]
public ActionResult JustTestRole()
{
    // to access this action user must have Admin role
}