Я использую ASP. NET Core 3.1 с идентификатором Ping в качестве органа. Я использую промежуточное программное обеспечение JwTbearer (с использованием Microsoft.AspNetCore.Authentication.JwtBearer;)
В настоящее время у меня есть пример API, запущенный и работающий с использованием ASP. NET Core, и заблокировал его с помощью [Авторизовать] , Моя проблема возникает, когда я передаю токен-носитель в API, и он пытается в режиме онлайн проверить токен с помощью Ping.
Я получаю это сообщение об ошибке:
"info: Microsoft.AspNetCore.Authentication. JwtBearer.JwtBearerHandler [1] Не удалось проверить токен. Microsoft.IdentityModel.Tokens.SecurityTokenSignatureKeyNotFoundException: IDX10501: Сбой проверки подписи. Невозможно сопоставить ключ: kid "
Для конечного клиента это сообщение не возвращается, так как 4 возвращается к сообщению, которое не возвращается как возвращаемое как сообщение 4 .
При отладке кода, который я увидел, промежуточное программное обеспечение было:
- , связанное с конечной точкой /.well-known/openid-configuration (что правильно)
- используя информацию, полученную от вышеуказанной конечной точки, чтобы связаться с конечной точкой / pf / JWKS
На этом этапе происходит сбой с указанным выше сообщением об ошибке. Я пошел ко второй конечной точке и искал ребенка, его не было.
В этот момент я пошел к нашим архитекторам Ping и спросил их, почему у них нет нашего ребенка с открытым ключом c в этой конечной точке их ответом было использование /as/introspect.oauth2, и именно это используют большинство других приложений здесь.
Мои два вопроса:
1) Поскольку промежуточное ПО обнаружив, что кажется нам неправильной конечной точкой, как я могу переопределить ее, чтобы она использовала правильную?
2) Конечной точке самоанализа требуется отправить ключ авторизации с Basi c и секретным закодированным используя BASE64, как бы это реализовать? Я вижу, что IdentityServer4.AccessTokenValidation поддерживает это с секретом options.api, но я не вижу ничего похожего с JwtBearer.
Если я загружаю сертификат органа publi c малыша из органа и делаю локальную проверку, которая работает нормально , но мы хотим использовать онлайн-проверку.
Код, который я использую следующим образом:
services.AddAuthentication(
options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
// I will be putting the authority and audience values into the appsettings.json file and pulling it from there before this goes live
.AddJwtBearer(options =>
{
options.Authority = "https://myAuthority....";
options.Audience = "https://myAudience...";
options.MetadataAddress = "https://myAuthority.../.well-known/openid-configuration";
// I configured this backchannel handler so I could see what it was passing to the authority easily.
options.BackchannelHttpHandler = new AuthorizingHandler(innerHandler, headerValue);
}
...
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
et c ....
AuthorizingHandler:
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);
}
Я использую client_credential flow для запроса токена доступа у Ping с помощью Postman, возвращение которого выглядит примерно так:
"access_token": "eyedwedwed ........ et c "," token_type ":" Bearer "," expires_in ": 3599
Любая помощь будет наиболее ценной, так как я рву на себе волосы с этим!
Спасибо, Маркус