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