Ролевая авторизация в ASP.NET CoreRole-based authorization in ASP.NET Core

При создании удостоверения может принадлежать одной или нескольких ролей.When an identity is created it may belong to one or more roles. Например Трейси может принадлежать к роли администратора и пользователя, пока Скотт может принадлежать только к роли пользователя.For example, Tracy may belong to the Administrator and User roles whilst Scott may only belong to the User role. Как эти роли создаются и управляются зависит от хранилище процесса авторизации.How these roles are created and managed depends on the backing store of the authorization process. Роли имеют доступ к деятельность разработчика IsInRole метод ClaimsPrincipal класса.Roles are exposed to the developer through the IsInRole method on the ClaimsPrincipal class.

Добавление проверки ролиAdding role checks

Проверки авторизации на основе ролей являются декларативными—разработчик внедряет их в свой код от контроллера или действия в контроллере, определения ролей, которые текущий пользователь должен быть членом для доступа к запрошенному ресурсу.Role-based authorization checks are declarative—the developer embeds them within their code, against a controller or an action within a controller, specifying roles which the current user must be a member of to access the requested resource.

Например, следующий код ограничивает доступ ко всем действиям на AdministrationController пользователям, являются членами Administrator роли:For example, the following code limits access to any actions on the AdministrationController to users who are a member of the Administrator role:

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

Можно указать несколько ролей в виде списка с разделителями-запятыми:You can specify multiple roles as a comma separated list:

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

Этот контроллер не превысит доступными пользователям, которые являются членами объекта HRManager роли или Finance роли.This controller would be only accessible by users who are members of the HRManager role or the Finance role.

Если применить несколько атрибутов доступ к пользователю необходимо быть членом всех ролей, указанных; Следующий пример требует, что пользователь должен быть одновременно членом групп PowerUser и ControlPanelUser роли.If you apply multiple attributes then an accessing user must be a member of all the roles specified; the following sample requires that a user must be a member of both the PowerUser and ControlPanelUser role.

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

Ограничить доступ, применив атрибуты авторизации дополнительных ролей на уровне действия:You can further limit access by applying additional role authorization attributes at the action level:

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

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

В предыдущем коде фрагмент кода членах Administrator роли или PowerUser роли контроллера и SetTime действие, но только члены Administrator роли ShutDown действие.In the previous code snippet members of the Administrator role or the PowerUser role can access the controller and the SetTime action, but only members of the Administrator role can access the ShutDown action.

Можно также заблокировать контроллера, но Разрешить анонимные, не прошедшие проверку подлинности доступа к отдельным действиям.You can also lock down a controller but allow anonymous, unauthenticated access to individual actions.

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

    [AllowAnonymous]
    public ActionResult Login()
    {
    }
}

Для страниц Razor AuthorizeAttribute можно применить, либо:For Razor Pages, the AuthorizeAttribute can be applied by either:

  • С помощью соглашение, илиUsing a convention, or
  • Применение AuthorizeAttribute для PageModel экземпляр:Applying the AuthorizeAttribute to the PageModel instance:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

Важно!

Фильтрация атрибутов, включая AuthorizeAttribute, может применяться только к модели страницы и не может применяться к определенной странице методы обработчика.Filter attributes, including AuthorizeAttribute, can only be applied to PageModel and cannot be applied to specific page handler methods.

Проверок роли на основе политикPolicy based role checks

Требования к роли могут также выражаться с помощью нового синтаксиса политики, где разработчик регистрирует политику при запуске как часть конфигурации службы авторизации.Role requirements can also be expressed using the new Policy syntax, where a developer registers a policy at startup as part of the Authorization service configuration. Это обычно происходит в ConfigureServices() в вашей Startup.cs файла.This normally occurs in ConfigureServices() in your Startup.cs file.

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

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

Политики применяются с помощью Policy свойство AuthorizeAttribute атрибута:Policies are applied using the Policy property on the AuthorizeAttribute attribute:

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

Если вы хотите указать несколько ролей, разрешенных в требования, а затем их можно указать в качестве параметров для RequireRole метод:If you want to specify multiple allowed roles in a requirement then you can specify them as parameters to the RequireRole method:

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

В этом примере разрешает пользователям, принадлежащим к Administrator, PowerUser или BackupAdministrator ролей.This example authorizes users who belong to the Administrator, PowerUser or BackupAdministrator roles.

Добавление служб роли удостоверениюAdd Role services to Identity

Добавление AddRoles для добавления служб ролей:Append AddRoles to add Role services:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddRoles<IdentityRole>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}