Авторизация на основе Claims

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 13.12.2019

Роли позволяют разграничить доступ, однако для создания авторизации функциональности ролей бывает недостаточно. Например, что если мы хотим разграничить доступ на основе возраста пользователя или каких-то других признаков. Для этого применяется авторизация на основе claims. Собственно авторизация на основе ролей фактически представляет частный случай авторизации на основе claims, так как роль это тот же объект Claim, имеющий тип ClaimsIdentity.DefaultRoleClaimType:

new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role?.Name)

Для авторизации на основе claims используются политики (policy). Политика представляет набор ограничений, которым должен соответствовать пользователь для доступа к ресурсу.

Все применяемые политики добавляются в методе ConfigureServices() класса Startup с помощью метода services.AddAuthorization(). Этот метод устанавливает политики с помощью объекта AuthorizationOptions. Например:

public void ConfigureServices(IServiceCollection services)
{
	//............................
    services.AddAuthorization(opts => {
        opts.AddPolicy("OnlyForMicrosoft", policy => {
            policy.RequireClaim("company", "Microsoft");
        });
    });
}

В данном случае добавляется политика с именем "OnlyForMicrosoft". И она требует обязательной установки для текущего пользователя объекта Claim с типом "company" и значением "Microsoft". Если для пользователя не будет установлено подобного объекта Claim, то такой пользователь не будет соответствовать политике.

Для управления политиками в классе AuthorizationOptions определены следующие свойства и методы:

  • DefaultPolicy: возвращает политику по умолчанию, которая используется, когда атрибут Authorize применяется без параметров

  • AddPolicy(name, policyBuilder): добавляет политику

  • GetPolicy(name): возвращает политику по имени

Ключевым методом здесь является AddPolicy(). Первый параметр метода представляет название политики, а второй - делегат, который с помощью объекта AuthorizationPolicyBuilder позволяет создать политику по определенным условиям. Для создания политики могут применяться следующие методы класса AuthorizationPolicyBuilder:

  • RequireAuthenticatedUser(): пользователь обязательно должен быть аутентифицирован для соответствия политике

  • RequireClaim(type): для пользователя должен быть установлен claim с типом type. Причем не важно, какое значение будет иметь этот claim, главное, его наличие

  • RequireClaim(type, values): для пользователя должен быть установлен claim с типом type. Но теперь claim должен в качестве значения иметь одно из значений из массива values.

  • RequireRole(roles): пользователь должен принадлежать к одной из ролей из массива roles

  • RequireUserName(name): для соответствия политике пользователь должен иметь ник (логин) name

  • RequireAssertion(handler): запрос должен соответствовать условию, которое устанавливается с помощью делегата handler

  • AddRequirements(requirement): позволяет добавить кастомное ограничение requirement, если имеющихся недостаточно

Фактически данные методы задают ограничения, которым должен соответствовать пользователь, обращающийся к приложению. После установки ограничений политики в ConfigureServices() мы можем их применять для разграничения доступа:

public class HomeController : Controller
{
    [Authorize(Policy = "OnlyForMicrosoft")]
    public IActionResult Index()
    {
        return View();
    }
}

Для установки политики у атрибута AuthorizeAttribute применяется свойство Policy. Оно указывает на название политики, которой должны соответствовать пользователи. И если пользователи соответствуют тем ограничениям, которые были установлены для политики в методе ConfigureServices(), то для них будет разрешен доступ к методу Index.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850