JwtBearerHandler с заголовком авторизации для конечной точки обнаружения - PullRequest
0 голосов
/ 25 октября 2018

Я использую ASP.NET Core 2.1 со схемой JwtBearer для аутентификации, например так:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(o =>
        {
            // my options here
        });
}

Довольно стандартная проблема, с которой я столкнулся, это то, что моей конечной точке обнаружения полномочий токенов требуется авторизация.для доступа.Что мне нужно сделать, так это вставить заголовок базовой аутентификации в запрос, который промежуточное программное обеспечение JWT выполняет для моей конечной точки доступа.Я смотрю на параметры конфигурации и не вижу ничего, что позволило бы мне это сделать.Я также просматриваю исходный код, чтобы увидеть, могу ли я увидеть, где делается http-запрос, но он довольно запутан с помощью методов абстракции и расширения, и я пока не нашел его.

Кто-нибудь сможетсказать мне, если это можно установить где-нибудь или мне нужно будет создать свой собственный обработчик авторизации и связать вещи вручную?Любой совет приветствуется.

1 Ответ

0 голосов
/ 26 октября 2018

По умолчанию схема аутентификации JwtBearer будет использовать ConfigurationManager для конфигурации, выставленной на .well-known/openid-configuration.Если вы не настроите экземпляр явно, установив свойство JwtBearerOptions.ConfigurationManager, то он автоматически создаст одно после вашей конфигурации :

var httpClient = new HttpClient(options.BackchannelHttpHandler ?? new HttpClientHandler());
httpClient.Timeout = options.BackchannelTimeout;
httpClient.MaxResponseContentBufferSize = 1024 * 1024 * 10; // 10 MB

options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(options.MetadataAddress, new OpenIdConnectConfigurationRetriever(),
    new HttpDocumentRetriever(httpClient) { RequireHttps = options.RequireHttpsMetadata });

Вы можете явнопредварительно установите менеджер конфигурации, чтобы этот код не работал.Таким образом, вы можете предоставить свою собственную реализацию или HttpClient, который правильно авторизует свои запросы.

Если вы посмотрите на код, есть также BackchannelHttpHandler.Это HttpClientHandler, который используется для обратной связи.Запросы обратного канала - все те, которые связываются с властью;поэтому не только конечная точка конфигурации, но и такие вещи, как конечная точка userinfo для OAuth.Поскольку JWT не имеет никакого обратного канала связи, вам не нужно беспокоиться об этом в этом случае, но, поскольку вы также можете настроить это, например, для OAuth, важно помнить об этом.

Поэтому, используя это BackchannelHttpHandler, например, вы можете указать учетные данные:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(o =>
    {
        options.BackchannelHttpHandler = new HttpClientHandler()
        {
            UseDefaultCredentials = true,
        };

        // …
    });

Если вам нужны другие учетные данные, например, используя заголовок HTTP Authorization, вы также можете указать свои DelegatingHandler который добавляет HTTP-заголовок перед делегированием запроса к обычному HttpClientHandler.Примерно так:

public class AuthorizingHandler : DelegatingHandler
{
    private readonly string _headerValue;
    public AuthorizingHandler(HttpMessageHandler inner, string headerValue)
        : base(inner)
    {
        _headerValue = headerValue;
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Add("Authorization", _headerValue);
        return base.SendAsync(request, cancellationToken);
    }
}
var innerHandler = new HttpClientHandler();
var headerValue = "Bearer foobar";
options.BackchannelHttpHandler = new AuthorizingHandler(innerHandler, headerValue);

Другая альтернатива - просто предоставить конфигурацию напрямую, используя JwtBearerOptions.Configuration.Но, конечно, для этого нужно синхронизировать настройки с полномочиями другими способами, поэтому, скорее всего, это не очень хороший вариант.

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