Поделиться через


Сборка служб, устойчивых к обновлению метаданных Идентификатора Microsoft Entra ID OpenID Подключение

Защищенным веб-API необходимо проверять маркеры доступа. Веб-приложения также проверяют маркеры идентификации. Проверка маркера состоит из нескольких этапов: принадлежит ли он приложению, выдан ли доверенным поставщиком удостоверений (IDP), имеет ли время существования в допустимом диапазоне и не был ли он изменен. Также могут быть специальные проверки. Например, приложению необходимо проверить подпись и достоверность ключей подписывания (если они внедрены в маркер), а также убедиться, что этот маркер не воспроизводится. Если ключи подписывания не внедрены в маркер, они должны быть получены от поставщика удостоверений (обнаружение или метаданные). Иногда также требуется динамическое получение ключей во время выполнения.

Чтобы быть устойчивыми, веб-приложениям и веб-API необходимо обновлять устаревшие метаданные OpenID Connect. Эта статья поможет вам при создании устойчивых приложений. Это относится к ASP.NET Core, ASP.NET и Microsoft.IdentityModel.

ASP.NET Core

Используйте последнюю версию Microsoft.IdentityModel* и вручную выполните приведенные ниже рекомендации.

В методе ConfigureServices файла Startup.cs убедитесь, что параметр JwtBearerOptions.RefreshOnIssuerKeyNotFound имеет значение true и что вы используете последнюю версию библиотеки Microsoft.IdentityModel*. Это свойство должно быть включено по умолчанию.

services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
    …
    // shouldn’t be necessary as it’s true by default
    options.RefreshOnIssuerKeyNotFound = true;
    …
});

ASP.NET/OWIN

Корпорация Майкрософт рекомендует перейти на ASP.NET Core, так как разработка ASP.NET уже не ведется.

Если вы используете ASP.NET (классическая модель), используйте последнюю версию Microsoft.IdentityModel.*.

OWIN автоматически выполняет обновление для OpenIdConnectConfiguration каждые 24 часа. Это обновление будет запущено, только если получен запрос по истечении 24-часового интервала времени. Насколько мы знаем, возможность изменить это значение или активировать обновление раньше не предусмотрена, если не считать перезапуска приложения.

Microsoft.IdentityModel

Если вы проверяете маркер самостоятельно, например в Функциях Azure, используйте последнюю версию Microsoft.IdentityModel* и следуйте указаниям по метаданным, приведенным в фрагментах кода ниже.

var configManager =
  new ConfigurationManager<OpenIdConnectConfiguration>(
    "http://someaddress.com",
    new OpenIdConnectConfigurationRetriever());

var config = await configManager.GetConfigurationAsync().ConfigureAwait(false);
var validationParameters = new TokenValidationParameters()
{
  …
  IssuerSigningKeys = config.SigningKeys;
  …
}

var tokenHandler = new JsonWebTokenHandler();
result = Handler.ValidateToken(jwtToken, validationParameters);
if (result.Exception != null && result.Exception is SecurityTokenSignatureKeyNotFoundException)
{
  configManager.RequestRefresh();
  config = await configManager.GetConfigurationAsync().ConfigureAwait(false);
  validationParameters = new TokenValidationParameters()
  {
    …
    IssuerSigningKeys = config.SigningKeys,
    …
  };

  // attempt to validate token again after refresh
  result = Handler.ValidateToken(jwtToken, validationParameters);
}

Следующие шаги

Дополнительные сведения см. в разделе Проверка маркеров в защищенном веб-API.