Crie serviços resilientes à atualização de metadados do Microsoft Entra ID OpenID Connect
As 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, foi emitido por um Provedor de Identidade (IDP) confiável, tem um tempo de vida que ainda está ao alcance e não foi adulterado. Também pode haver validações especiais. Por exemplo, o aplicativo precisa validar a assinatura e que as chaves de assinatura (quando incorporadas em um token) são confiáveis e que o token não está sendo reproduzido. Quando as chaves de assinatura não estão incorporadas no token, elas precisam ser buscadas no provedor de identidade (Descoberta ou Metadados). Às vezes, também é necessário obter chaves dinamicamente em tempo de execução.
Aplicativos Web e APIs da Web precisam atualizar metadados obsoletos do OpenID Connect para que sejam resilientes. Este artigo ajuda a orientar sobre como obter aplicativos resilientes. Ele se aplica ao ASP.NET Core, ASP.NET e Microsoft.IdentityModel.
ASP.NET Core
Use a versão mais recente do Microsoft.IdentityModel.* e siga manualmente as diretrizes abaixo.
ConfigureServices
No método Startup.cs, verifique se está definido como true e se JwtBearerOptions.RefreshOnIssuerKeyNotFound
você está usando a biblioteca Microsoft.IdentityModel.* mais recente. Essa propriedade deve ser habilitada 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 no ASP.NET.
Se estiver a utilizar o ASP.NET (Clássico), utilize o Microsoft.IdentityModel mais recente .*.
O OWIN tem um intervalo de atualização automático de 24 horas para o OpenIdConnectConfiguration
. Essa atualização só será acionada se uma solicitação for recebida após o período de 24 horas. Até onde sabemos, não há como alterar esse valor ou acionar uma atualização antecipadamente, além de reiniciar o aplicativo.
Microsoft.IdentityModel
Se você validar seu 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óximos passos
Para saber mais, consulte Validação de token em uma API da Web protegida