По умолчанию схема аутентификации 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
.Но, конечно, для этого нужно синхронизировать настройки с полномочиями другими способами, поэтому, скорее всего, это не очень хороший вариант.