Сборка служб, устойчивых к обновлению метаданных Идентификатора 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.