Share via


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