Как я могу получить доступ к конфигурации обработчика аутентификации JwtBearer в действии контроллера?

У меня есть веб-приложение ASP.NET Core, настроенное на использование токенов-носителей JWT для аутентификации:

// Setup.cs
// ...
public void ConfigureServices(IServiceCollection services) {
    services
        .AddAuthentication()
        .AddJwtBearer(
            options =>
            {
                options.Authority = "https://known.authority.url";
            });
}
// ...

Приложение имеет действие контроллера, с помощью которого оно может получать JWT, подписанные с использованием той же ключевой информации в теле запроса POST.

// TokenController.cs
// ...
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> ActionAsync()
{
    using (var stream = new MemoryStream())
    using (var reader = new StreamReader(stream))
    {
        await Request.Body.CopyToAsync(stream);
        stream.Seek(0, SeekOrigin.Begin);

        var jwt = await reader.ReadToEndAsync();

        // ...
    }
    // ...
}
// ...

Я хотел бы проверить JWT, полученный в действии контроллера, используя те же параметры проверки и ключи подписи, настроенные в обработчике аутентификации токена-носителя. (В идеале без дублирования конфигурации действия контроллера.)

Как я могу получить доступ к свойствам JwtBearerOptions Configuration обработчика аутентификации в действии контроллера?

Я подтвердил, что JwtBearerHandler является зарегистрированной службой в HttpContext.RequestServices, но ее свойство Options всегда равно null.


person jtcalhoun    schedule 14.08.2019    source источник


Ответы (1)


Нашел ответ: ASP.NET регистрирует службу IAuthenticationHandlerProvider, которую можно использовать для получения обработчика аутентификации по его схеме.

Итак, после изменения файла Startup.cs для включения схемы аутентификации для обработчика переноса JWT:

// Startup.cs
// ...
public void ConfigureServices(IServiceCollection services)
{
    services
        .AddAuthentication()
        .AddJwtBearer(
            authenticationScheme: "MY_AUTH_SCHEME", // NEW
            options =>
            {
                options.Authority = "https://known.authority.url";
            });
}
// ...

Используйте службу провайдера обработчика аутентификации и его метод GetHandlerAsync, чтобы получить обработчик и его параметры:

// TokenController.cs
// ...
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> ActionAsync()
{
    // NEW
    var provider = HttpContext.RequestServices.GetService<IAuthenticationHandlerProvider>();

    // NEW
    var handler = await provider.GetHandlerAsync(HttpContext, "MY_AUTH_SCHEME") as
        AuthenticationHandler<JwtBearerOptions>;

    // NEW
    var jwtBearerOptions = handler.Options;

    using (var stream = new MemoryStream())
    using (var reader = new StreamReader(stream))
    {
        await Request.Body.CopyToAsync(stream);
        stream.Seek(0, SeekOrigin.Begin);

        var jwt = await reader.ReadToEndAsync();

        // NEW
        var tokenValidationParameters = jwtBearerOptions.TokenValidationParameters;

        // ...
    }
    // ...
}
// ...
person jtcalhoun    schedule 14.08.2019