Как сказать промежуточному программному обеспечению 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() там сам.

Спасибо!

0 ответов