Авторизация в зависимости от роли

У пользователей может быть одна или несколько ролей, например, Трейси может быть администратором и пользователем, а Скотт может быть только пользователем. Создание и управление этими ролями зависит от процесса авторизации. Разработчик может делать это с помощью свойства IsInRole класса ClaimsPrincipal.

Проверка ролей

Проверка ролей является декларативной - разработчики включают ее в свой код, в контроллер или метод действия, указывая роли, определяющие, может ли текущий пользователь получить доступ к ресурсу.

Например, с помощью данного кода вы ограничите доступ к любому методу действия в контроллере Administration для пользователей, которые являются членами группы Administrator.

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}

Вы можете указать несколько ролей, разделив их запятыми:

[Authorize(Roles = "HRManager, Finance")]
public class SalaryController : Controller
{
}

Этот контроллер будет доступен только для тех пользователей, у которых есть роль HRManager или Finance.

Если вы применяете несколько атрибутов, тогда для доступа к ресурсу у пользователя должны быть все перечисленные роли; в следующем примере показано, что пользователь должен иметь обе роли - PowerUser и ControlPanelUser.

[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
}

Вы можете ограничить доступ, применив дополнительные атрибуты авторизации на уровне метода действия:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

Пользователи с ролями Administrator и PowerUser могут получить доступ к контроллеру и методу действия SetTime, но только пользователи с ролью Administrator могут получить доступ к методу действия ShutDown.

Также вы можете ограничить доступ к контроллеру, но позволить доступ к отдельным методам действия.

[Authorize]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
    }
}

Проверка ролей на основе политики авторизации

Требования к ролям также можно выразить с помощью синтаксиса Policy, когда разработчик регистрирует политику при настройке сервиса Authorization. Обычно это является частью ConfigureServices() файла startup.cs.

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("Administrator"));
    });
}

Политика применяется с помощью параметра Policy атрибута Authorize:

[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
    return View();
}

Если вы хотите указать несколько разрешенных ролей, то вам нужно указать их в виде параметров метода RequireRole:

options.AddPolicy("ElevatedRights", policy =>
                  policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));

Здесь будет авторизирован пользователь с ролью Administrator, PowerUser и/или BackupAdministrator.

Поделись хорошей новостью с друзьями!
Следи за новостями!