Я пытаюсь получить аутентификацию канала-носителя JWT в шлюзе API ASP.Net, используя Ocelot для работы с несколькими полномочиями / эмитентами.Один эмитент - Auth0, а другой - внутренний сервер аутентификации на основе IdentityServer4;мы пытаемся перейти от Auth0, но у нас есть внешние клиенты, которые по-прежнему зависят от него, поэтому мы хотели бы поддерживать оба, пока все не будет полностью протестировано на их переключение.
Согласно этого сообщения в блоге MSDN можно использовать несколько прав доступа, установив TokenValidationParameters.ValidIssuers
вместо JwtBearerOptions.Authority
.Тем не менее, я проверил это с Ocelot и без него, и никакая аутентификация не происходит, если Орган не настроен на орган, выдавший токен, независимо от содержимого TokenValidationParameters.ValidIssuers
.
Кто-нибудь знает, как получить этоза работой?Вот как я настраиваю аутентификацию.Это работает, только если закомментированная строка не закомментирована (и только для токенов, выпущенных этим единственным органом).Я ожидаю, что Ocelot или ASP.Net Core получат ключ от сервера выдачи;оба обеспечивают JWK с помощью .well-known / openid-configuration, которая работает с промежуточным программным обеспечением ASP.Net Core.
public static void AddJwtBearerAuthentication(this IServiceCollection services, IConfiguration configuration)
{
services
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
//options.Authority = configuration["Jwt:Authority"];
options.Audience = configuration["Jwt:Audience"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateIssuerSigningKey = true,
ValidateAudience = true,
ValidAudience = configuration["Jwt:Audience"],
ValidIssuers = configuration
.GetSection("Jwt:Authorities")
.AsEnumerable()
.Select(kv => kv.Value)
.Where(s => !string.IsNullOrEmpty(s))
.ToArray()
};
});
}
Вывод Ocelot, когда клиент имеет неверного эмитента (или когда мы используемTokenValidationParameters.ValidIssuer
/ ValidIssuers
) connects:
[16:35:37 WRN] requestId: _____, previousRequestId: no previous request id, message: Error Code: UnauthenticatedError Message: Request for authenticated route _____ by was unauthenticated errors found in ResponderMiddleware. Setting error response for request path:_____, request method: POST
Это аутентификация client_credentials, отсюда и отсутствие имени пользователя после «by».Как видите, Оцелот не говорит, в чем именно заключается проблема.Ядро промежуточного программного обеспечения JWT ASP.Net Core (без Ocelot) просто говорит, что подпись недействительна.Я подозреваю, что он либо не смотрит на TokenValidationParameters
, либо я неправильно понял их назначение.