Чтение AuthorizationFilterContext в Netcore API 3.1 - PullRequest
0 голосов
/ 25 октября 2019

У меня есть работающий проект netcore 2.2, в котором я реализовал пользовательскую политику, которая проверяет наличие ключей API.

В файле startup.cs я добавляю эту политику следующим образом:

//Add Key Policy
services.AddAuthorization(options =>
{
    options.AddPolicy("AppKey", policy => policy.Requirements.Add(new AppKeyRequirement()));
});

В моем AppKeyRequirement я наследую от AuthorizationHandler и разрешаю ключи во входящих запросах, как это

protected override Task HandleRequirementAsync(AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
{
    var authorizationFilterContext = (AuthorizationFilterContext)authContext.Resource;
    var query = authorizationFilterContext.HttpContext.Request.Query;

    if (query.ContainsKey("key") && query.ContainsKey("app"))
    { // Do stuff

Это не работает в netcore 3.1

Я получаю следующую ошибку:

Невозможно привести объект типа «Microsoft.AspNetCore.Routing.RouteEndpoint» к типу «Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext».

Как правильно сделатьэто в ядре 3 и выше?

Как указал Кирк Ларкин, правильный путь в .net 3.0 и выше - внедрить IHttpContextAccessor в обработчик Auth и использовать его.

Мой вопрос вэтот пункт, как я могу ввести это? Я не могу передать это в файле startup.cs или, по крайней мере, я не вижу, как это сделать.

Любые идеи / советы будут высоко оценены.

1 Ответ

1 голос
/ 26 октября 2019

В версиях, предшествующих ASP.NET Core 3.0, реализации IAuthorizationHandler вызывались во время конвейера MVC. Начиная с версии 3.0, которая использует маршрутизацию конечных точек (по умолчанию), эти реализации вызываются промежуточным ПО авторизации (UseAuthorization()). Это промежуточное ПО запускается до конвейера MVC, а не как его часть.

Это изменение означает, что AuthorizationFilterContext больше не передается обработчикам авторизации. Вместо этого это экземпляр RouteEndpoint, который не предоставляет доступа к HttpContext.

. В вашем примере вы используете AuthorizationFilterContext только для получения HttpContext. В версии 3.0+ введите IHttpContextAccessor в ваш обработчик авторизации и используйте его. Вот пример для полноты:

public class AppKeyAuthorizationHandler : AuthorizationHandler<AppKeyRequirement>
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public AppKeyAuthorizationHandler(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
    {
        var httpContext = httpContextAccessor.HttpContext;
        var query = httpContext.Request.Query;

        if (query.ContainsKey("key") && query.ContainsKey("app"))
        {
            // ...
        }
    }
}

Вам также может потребоваться регистрация IHttpContextAccessor в ConfigureServices:

services.AddHttpContextAccessor();

См. Использование HttpContext из пользовательских компонентов для получения дополнительной информации об использовании IHttpContextAccessor.

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