Claims-Based авторизация

После создания сущности она может быть присвоена одному или нескольким “claims”. Claim - это пара ключ/значение, где ключ - это имя claim, а значение - это значение claim. Claim - это то, чем является субъект, а не то, что может делать субъект. Например, допустим, у вас есть водительские права. На них стоит дата вашего рождения. В данном случае именем claim было бы DateOfBirth, а значением claim была бы дата рождения. Сlaims-based авторизация в своем самом простом проявлении проверяет значение claim и предоставляет доступ к ресурсу, основываясь на этом значении. Например, если вы хотите попасть в ночной клуб, то охранник проверит ваши документы и оценит значение DateOfBirth claim, и если все в порядке, то вы получите туда доступ.

Сущность может содержать несколько “claims” с несколькими значениями, а также может содержать несколько “claims” одного типа.

Проверка “claims”

Проверка сlaim-based является декларативной - разработчик включает ее внутрь кода, в контроллер или в действие контроллера, указывая “claims”, которые должен обработать текущий пользователь, и опционально значение, которое должно быть у claim, чтобы получить доступ к запрашиваемому ресурсу. Разработчики должны создать и зарегистрировать политику, выражающую требования “claims”.

При самом простом типе политики claim ищется claim, но не проверяется значение.

Сперва вам нужно создать и зарегистрировать политику. Это является частью конфигурации сервиса авторизации, и обычно она находится в ConfigureServices() в файле startup.cs.

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

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    }
        });
}

В данном случае политика EmployeeOnly проверяет наличие EmployeeNumber claim текущей сущности.

Далее вы применяете политику, используя параметр Policy для атрибута Authorize, чтобы указать имя политики:

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

Атрибут Authorize можно применить для всего контроллера, в данном случае только сущности, подходящие для политики, получат доступ к методам действия контроллера.

[Authorize(Policy = "EmployeeOnly")]
public class VactionController : Controller
{
    public ActionResult VacationBalance()
    {
    }
}

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

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Помните, что у большинства “claims” есть значение. Вы можете указать список разрешенных значений при создании политики. В следующем примере только сотрудники под номерами 1, 2, 3, 4 или 5 могут получить нужный доступ.

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

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Founders", policy =>
                          policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    }
}

Оценка различных политик

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

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public ActionResult Payslip()
    {
    }

    [Authorize(Policy = "HumanResources")]
    public ActionResult UpdateSalary()
    {
    }
}

В примере выше любая сущность, выполняющая политику EmployeeOnly, может получить доступ к действию Payslip, поскольку эта политика вызывается контроллером. Однако чтобы вызвать метод действия UpdateSalary, сущность должна выполнять обе политики - EmployeeOnly и HumanResources.

Если вам нужны более сложные политики, то нужно прописать обработчики пользовательской политики.

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