Читання файла авторизаціїFilterContext в netcore api 3.1


9

У мене працює проект 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 або, принаймні, не бачу як.

Будь-які ідеї / підказки будуть дуже вдячні.

Відповіді:


14

У версіях, що передували 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 .


1
Дякую за цю підказку Я намагаюся створити політику, в якій, якщо відсутній ключ API, виклик буде відхилено. Чи можемо ми більше не використовувати // Додати ключові послуги політики.AddAuthorization (options => {options.AddPolicy ("AppKey", policy => policy.Requirements.Add (новий AppKeyRequirement ()));}); Якщо ні, то як я можу перехопити виклик, перш ніж він потрапить на дію контролера?
w2olves

1
Так, це все одно працює так само, як і раніше.
Кірк Ларкін

Конструктор очікує на IHttpContextAccessor, як я можу це передати під час створення політики в Startup.cs? services.AddAuthorization (options => {options.AddPolicy ("AppKey", policy => policy.Requirements.Add (новий AppKeyRequirement ()));}); Я також можу створити новий конструктор за замовчуванням для AppKeyAuthorizationHandler, але потім httpContextAccessor.HttpContext; недійсне, коли надходить запит. Будь-які ідеї?
w2olves

1
Ви додаєте обробник за допомогою DI, який створює для вас його екземпляр і передає в IHttpContextAccessor. Дивіться документи .
Кірк Ларкін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.