У меня есть политика авторизации в моем API, которая проверяет, есть ли в заголовке что-то, что я ожидаю авторизовать API для продолжения. Он работает нормально, но я бы настроил свой ответ об ошибке на случай, если пользователь не авторизован. На самом деле это ответ 401, я бы ответил, например, 403.
Вот мой код:
API
[HttpPost("search/")]
[Authorize(Policy = "SearchSomething")]
public ActionResult<IEnumerable<DtoSomethingGeneral>> GetSomethingFiltered([FromBody] GeneralFilters Filters)
ЗАПУСК
services.AddAuthorization(options =>
{
options.AddPolicy("SearchSomething", policy =>
{
policy.Requirements.Add(new AuthorizationDtoRequirement(permission.SearchSomething));
});
АВТОРИЗАЦИЯТРЕБОВАНИЕ
public class AuthorizationDtoRequirement : IAuthorizationRequirement
{
public AuthorizationDtoRequirement(string permission)
{
Permission = permission;
}
public string Permission { get; set; }
}
public class AuthorizationDtoHandler : AuthorizationHandler <AuthorizationDtoRequirement>
{
IHttpContextAccessor _httpContextAccessor = null;
public AuthorizationDtoHandler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AuthorizationDtoRequirement requirement)
{
HttpContext httpContext = _httpContextAccessor.HttpContext;
string authHeader = httpContext.Request.Headers["UserPermission"];
if (authHeader != null && authHeader.Contains(requirement.Permission))
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
struct permission
{
public const string SearchSomething = "CAN_SEARCH_SOMETHING"; //The string in the header necessary to authorize the user
}
}