. Net Обработчик политики авторизации Core 3.1 - PullRequest
0 голосов
/ 08 мая 2020

У меня есть политика авторизации в моем 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
    }
}
...