Получение с перерывами.”Исключение SecurityTokenSignatureKeyNotFoundException: IDX10501: ошибка проверки подписи”

#adal #claims-based-identity

#adal #идентификация на основе утверждений

Вопрос:

  1. Мы развернули наши службы на платформе AKS версии 1.16.9.
  2. Наши службы были разработаны с использованием библиотеки-оболочки для аутентификации токена, который внутренне использует Microsoft.Идентификация.Модель.Токен для проверки токена. В большинстве сценариев это работает отлично. Он был настроен для приема токенов Azure adb2c, а также токенов учетных данных клиента Azure ad.
  3. Время от времени (иногда раз в два месяца) мы получаем исключение SecurityTokenSignatureKeyNotFoundException- ошибка только при использовании токена учетных данных клиента Azure adb2b. Та же библиотека отлично работает с использованием токенов Azure ad b2c. Пример фрагмента из компонента
  static Microsoft.IdentityModel.Tokens.TokenValidationParameters TokenValidationParameters(AppConfig appConfig)
    {
        var audiences = new List<string> {'audience1', 'audience2'};
        var issuers = new List<string> {'b2c', 'ad', 'auth0', 'identityserver'};
        var discoveryendpoints = new List<string> {'b2c meta url', 'ad meta url', 'auth0 meta url', 'identityserver meta url'};
        Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration openIdSigningConfigs = new Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration();
        foreach (var discoveryendpoint in discoveryendpoints)
        {
            Microsoft.IdentityModel.Protocols.ConfigurationManager<Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration> configManager = new Microsoft.IdentityModel.Protocols.ConfigurationManager<Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration>(discoveryendpoint, new Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever());
            Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration config = configManager.GetConfigurationAsync().Resu<
            foreach (var item in config.SigningKeys)
            {
                openIdSigningConfigs.SigningKeys.Add(item);
            }
        }
        var tvps = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
        {
            ValidateAudience = true,
            ValidateIssuer = true,
            ValidateLifetime = true,
            ValidAudiences = audiences,
            ValidIssuers = issuers,
            IssuerSigningKeys = openIdSigningConfigs.SigningKeys
        };
        return tvps;
    }

services.AddAuthentication(Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme) 
        .AddJwtBearer( 
                options => 
        { 
                options.TokenValidationParameters = TokenValidationParameters(tokenconfig); 
        });

 
  

Сведения об исключении:

«Майкрософт.AspNetCore.Аутентификация.JwtBearer.JwtBearerHandler [1] Не удалось проверить токен. Майкрософт.Модель идентификации.Жетоны.Исключение SecurityTokenSignatureKeyNotFoundException: IDX10501: Ошибка проверки подписи. Невозможно сопоставить ключ: » kid: ‘ Пойманы исключения:

Пожалуйста, обратите внимание, что пойманное исключение является пустым. Мы проверили соответствие дочернего элемента токена и конечной точки метаданных Azure Ad B2B. После получения ошибки мы постоянно получаем ошибку до перезапуска модуля. Как только мы воссоздаем модуль, исключение исчезает

Используемые компоненты ( «Майкрософт.Модель идентификации.Токены = Версия = 5.5.0, Microsoft.Режим идентификации 7.0.0, Microsoft.AspNetCore.Аутентификация.Версия JwtBearer=3.1.3)

Комментарии:

1. Похоже, у вас есть решение в GitHub

Ответ №1:

Мы обрабатывали конечную точку метаданных вручную и не знали, как обновить переходящие ключи. Похоже, что этот простой фрагмент кода может сделать трюк из коробки.

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

    .AddJwtBearer(options =>
    {
            options.Authority = "Authority Details";
            options.Audience = "Audience";
            options.MetadataAddress = "metadataendpotint";
    });
  

»’