декларативная авторизация требований на основе ресурсов не работает с контроллером 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");
}