Criar serviços resilientes à atualização de metadados do OpenID Connect da ID do Microsoft Entra
APIs da Web protegidas precisam validar tokens de acesso. Os aplicativos Web também validam os tokens de ID. A validação de token tem várias partes, verificando se o token pertence ao aplicativo, se foi emitido por um provedor de identidade confiável (IDP), se tem um tempo de vida que ainda está no intervalo e não foi violado. Também podem haver validações especiais. Por exemplo, o aplicativo precisa validar a assinatura e que as chaves de assinatura (quando inseridas em um token) são confiáveis e o token não está sendo repetido. Quando as chaves de assinatura não estão inseridas no token, elas precisam ser buscadas do provedor de identidade (descoberta ou metadados). Às vezes, também é necessário obter chaves de forma dinâmica no tempo de execução.
Os aplicativos Web e as APIs Web precisam atualizar os metadados do OpenID Connect obsoletos para que sejam resilientes. Este artigo ajuda com orientações de como obter aplicativos resilientes. Ele se aplica a ASP.NET Core, ASP.NET e Microsoft.IdentityModel.
ASP.NET Core
Use a versão mais recente de Microsoft.IdentityModel.* e siga as diretrizes abaixo manualmente.
No ConfigureServices
método de Startup.cs, verifique se JwtBearerOptions.RefreshOnIssuerKeyNotFound
está definido como true e se você está usando a biblioteca Microsoft.IdentityModel.* mais recente. Isso deve ser habilitado por padrão.
services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
…
// shouldn’t be necessary as it’s true by default
options.RefreshOnIssuerKeyNotFound = true;
…
});
ASP.NET/ OWIN
A Microsoft recomenda que você mude para o ASP.NET Core, pois o desenvolvimento foi interrompido para o ASP.NET.
Se você estiver usando o ASP.NET (clássico), use o Microsoft.IdentityModel.* mais recente.
OWIN tem um intervalo de atualização de 24 horas automático para o OpenIdConnectConfiguration
. Essa atualização só será disparada se uma solicitação for recebida depois que o período de 24 horas tiver passado. Até onde sabemos, não há como alterar esse valor ou disparar uma atualização antecipadamente, além de reiniciar o aplicativo.
Microsoft.IdentityModel
Se você validar o token por conta própria, por exemplo, em uma função do Azure, use a versão mais recente do Microsoft.IdentityModel.* e siga as diretrizes de metadados ilustradas pelos trechos de código abaixo.
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);
}
Próximas etapas
Para saber mais, consulte validação de token em uma API Web protegida