.NET CORE - политика с множеством требований, каждое из которых имеет свой собственный ресурс.

Я пытаюсь использовать авторизацию на основе политик и ресурсов. Допустим, у меня есть сотрудники, и у этих сотрудников есть специальности и службы, и, конечно же, начальники.

  • Сотрудник может быть изменен с помощью босса и другого сотрудника, который работает на своего босса и имеет привилегии.
  • специальность не может быть добавлена ​​к сотруднику, если она у него уже есть.
  • также нельзя добавить услугу сотруднику, если она у него уже есть.

Чтобы максимизировать возможность повторного использования, мой подход заключался в трех требованиях. CanEditEmployeeRequirement, CanManageEmployeeServicesRequirement и CanManageEmployeeSpecialtiesRequirement.

У первого требования есть обработчик, который принимает ресурс (Employee) в качестве параметра, выполняет необходимые проверки и завершается неудачно или успешно на основе этих проверок.

У второго требования есть обработчик, который принимает (EmployeeService) в качестве параметра, проверяет, что у сотрудника нет службы, и продолжает работу.

У третьего требования есть обработчик, который выполняет то же самое, что и второе, но с другой моделью (EmployeeSpecialty).

Теперь моя логика состоит в том, чтобы создать 2 политики:

config.AddPolicy("CanManageEmployeeServices", policyBuilder =>
            {
                policyBuilder.Requirements.Add(new CanEditEmployeeRequirement());
                policyBuilder.Requirements.Add(new CanManageEmployeeServicesRequirement());
            });

и

config.AddPolicy("CanManageEmployeeSpecialties", policyBuilder =>
                {
                    policyBuilder.Requirements.Add(new CanEditEmployeeRequirement());
                    policyBuilder.Requirements.Add(new CanManageEmployeeSpecialtiesRequirement());
                });

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

Проблема с этим подходом здесь:

public ActionResult<BusinessOwnerService> AddServiceToEmployee([FromBody] EmployeeService service)
    {
        var result = _authorizationService.AuthorizeAsync(User, service, "CanManageEmployeeServices").Result;
        if(!result.Succeeded)
            return StatusCode(403, "some error message.");
        //rest of code
}

Выше я передаю один ресурс (сервис) сервису авторизации. в то время как у политики есть два требования, и каждое относится к разному ресурсу. И, конечно же, авторизация не выполняется, потому что второй обработчик требований (тот, который принимает Employee в качестве ресурса) недоступен, потому что ему не был передан Employee.

У меня вопрос: возможно ли то, что я делаю? имеет ли это смысл?если да, как мне реализовать это, чтобы я мог пройти обе модели? если нет, не могли бы вы указать мне правильное направление, пожалуйста?

Остальной код:

Первое требование:

 public class CanManageEmployeeServicesRequirement : IAuthorizationRequirement
        {
        }

Его обработчик:

public class CanManageEmployeeServicesHandler : AuthorizationHandler<CanManageEmployeeServicesRequirement, EmployeeService>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CanManageEmployeeServicesRequirement requirement, EmployeeService resource)
    {
     //handler Code
    }

Второе требование:

 public class CanManageEmployeeSpecialtiesRequirement : IAuthorizationRequirement
        {
        }

Его обработчик:

public class CanManageEmployeeSpecialtiesHandler : AuthorizationHandler<CanManageEmployeeSpecialtiesRequirement , EmployeeSpecialty>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CanManageEmployeeServicesRequirement requirement, EmployeeSpecialty resource)
        {
         //handler Code
        }

Третье требование:

  public class CanEditEmployeeRequirement : IAuthorizationRequirement
    {
    }

Его обработчик:

public class CanEditEmployeeHandler : AuthorizationHandler<CanEditEmployeeRequirement , Employee>
    {
    
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CanManageEmployeeServicesRequirement requirement, Employee resource)
        {
         //handler Code
        }

0 ответов

Другие вопросы по тегам