Как сказать промежуточному программному обеспечению IdentityServer 4 не выполнять проверку подлинности, если ранее промежуточное программное обеспечение уже сделало это?
В моем ASP.NET Core REST API используется 2 промежуточных ПО для аутентификации - JWT для аутентификации пользователей (токены, выпущенные ADFS) и IdentityServer для аутентификации вызовов из других служб. Конфигурация для этих промежуточных программ выглядит следующим образом:
JWT
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new X509SecurityKey(federationMetadata.GetSigningCertificate()),
ValidateIssuer = true,
ValidIssuer = federationMetadata.GetIssuerUri().AbsoluteUri,
ValidateAudience = true,
ValidAudience = validAudience,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = tokenValidationParameters
});
Identity Server 4 (IDS)
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = dbConfig.IdentityServer.AbsoluteUri,
ScopeName = Configuration.ServiceName,
RequireHttpsMetadata = false
}
У меня проблемы с этой настройкой:
Когда пользователь передает токен из ADFS, промежуточное ПО JWT успешно проверяет токен. Промежуточное программное обеспечение IDS не может проверить токен и выдает ошибку:
IDX10503: Signature validation failed. Keys tried: 'Microsoft.IdentityModel.Tokens.RsaSecurityKey , KeyId: <MyRsaKey>
Это ожидается. Как я могу сказать промежуточному программному обеспечению IDS не выполнять аутентификацию, если более раннее промежуточное программное обеспечение успешно аутентифицировало запрос?
Я попробовал пару вещей. Мне кажется, что идеальным было бы работать на IDS OnMessageReceived
событие, когда пользователь прошел проверку подлинности, и сказать промежуточному программному обеспечению IDS, чтобы он больше не проверял:
JwtBearerEvents = new JwtBearerEvents()
{
OnMessageReceived = async (context) =>
{
if(UserIsAlreadyAuthenticated)
DoNothingMore();
}
}
- Как я могу проверить, аутентифицирован ли пользователь?
- Как сказать промежуточному программному обеспечению принять аутентификацию и больше не выполнять обработку?
Я пытался поймать IDS OnAuthenticationFailed
событие и пропуск промежуточного программного обеспечения:
OnAuthenticationFailed = async (context) =>
{
if (context.Exception is IdentityServerNotAvailableException)
{
context.SkipToNextMiddleware();
}
}
но затем я получаю ошибку проверки области:
Scope validation failed. Return 403.
Где происходит проверка объема? Кажется, что любая ошибка в промежуточном программном обеспечении IDS приводит к ошибке проверки области, независимо от того, SkipToNextMiddleware
или нет.
Если я удаляю промежуточное ПО IDS, все работает.
Спасибо за любую помощь!
РЕДАКТИРОВАТЬ: я решил вопрос проверки области на данный момент. Я пытался установить ValidateScope = false
опция в промежуточном программном обеспечении IDS, но это вызывает исключение нулевой ссылки внутри промежуточного программного обеспечения; но я обнаружил, что если я закомментирую ScopeName = Configuration.ServiceName
вариант, проблема проверки области решена (я обрабатываю это в пользовательском обработчике - не идеально).
Еще нужно знать: либо как указать промежуточному программному обеспечению IdentityServer пропустить, если токен был аутентифицирован успешно, либо определить успешную предыдущую аутентификацию в OnMessageReceived
событие, чтобы я мог позвонить SkipToNextMiddleware()
там сам.
Спасибо!