Как изменить и применить роль для текущего пользователя в ASP.NET MVC 5 - PullRequest
0 голосов
/ 26 декабря 2018

Сначала я расскажу о шагах, которые привели меня к проблемам с авторизацией ролей.

Сначала я добавлю 2 роли в свой construstor в HomeController.cs

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");

И проверь это на мой взгляд (Razor) так:

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

И проверьте это в моем HomeController через [Authorize(Roles = "Admin")].

Тогда дважды произойдет сбой.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 голосов
/ 12 января 2019

Чтобы применить изменения в замене роли пользователя, этот пользователь должен войти снова.По сути, скажем, у нас есть какая-то служба с именем 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() Задачу обновить куки-файл аутентификации, чтобы он соответствовал базе данных.

public class HomeController : Controller
{
    private UserService _userService;

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

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

Теперь вызовите ApplyRole Задача, например, в представлении (.cshtml):

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

Текущая роль пользователя применена и готова к тестированию.Например:

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