декларативная авторизация требований на основе ресурсов не работает с контроллером API

Я пытаюсь настроить политику авторизации, которую я могу использовать для украшения действий в контроллерах API в ядре.NET 3.1. Я следил за этими примерами: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/resourcebased?view=aspnetcore-3.1

Если у меня есть действие API, оформленное, как показано ниже, мой код не попадает в метод handlerequirementAsync обработчика, и я получаю ответ 403 Forbidden от swagger. Если я удалю модель документа из обработчика / требования, она сработает. Я что-то делаю не так или это не поддерживается для запросов api?

вот другой соответствующий код:

    public class DocumentAuthorizationHandler : 
    AuthorizationHandler<SameAuthorRequirement, Document>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   SameAuthorRequirement requirement,
                                                   Document resource)
    {
        if (context.User.Identity?.Name == resource.Author)
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

public class SameAuthorRequirement : IAuthorizationRequirement { }


[Authorize(Policy = "EditPolicy")]
public async Task<FileResult> RetreiveFile([FromRoute]Document model)


 {
 }

services.AddAuthorization(options =>
{
    options.AddPolicy("EditPolicy", policy =>
        policy.Requirements.Add(new SameAuthorRequirement()));
});

services.AddSingleton<IAuthorizationHandler, DocumentAuthorizationHandler>();

1 ответ

Вы должны были ввести IAuthorizationServiceв конструкторе контроллера

      public class AbcController : Controller
{
   private readonly IAuthorizationService _authorizationService;

   public AbcController(IAuthorizationService authorizationService)
   {
      _authorizationService = authorizationService;
   } 
   // No need to add this [Authorize(Policy = "EditPolicy")]
   public async Task<FileResult> RetreiveFile([FromRoute]Document model)
   {
      //add this below line which shall call the handler
       var authorizationResult = await _authorizationService.AuthorizeAsync(User, model, "EditPolicy"); 
   }
Другие вопросы по тегам