Compartir vía


Crear servicios resistentes a la actualización de metadatos de OpenID Connect de Microsoft Entra ID

Las API web protegidas deben validar los tokens de acceso. Las aplicaciones web también validan los tokens de identificador. La validación de tokens tiene varias partes, y se comprueba si el token pertenece a la aplicación, si lo ha emitido un proveedor de identidades (IDP) de confianza, si su duración todavía está en el intervalo y si no se ha alterado. También puede haber validaciones especiales. Por ejemplo, la aplicación debe validar la firma y comprobar que las claves de firma (cuando se insertan en un token) sean de confianza y que el token no se esté reproduciendo. Cuando las claves de firma no se insertan en el token, deben capturarse desde el proveedor de identidades (detección o metadatos). A veces también es necesario obtener las claves de forma dinámica en tiempo de ejecución.

Las aplicaciones web y las API web deben actualizar los metadatos de OpenID Connect obsoletos para que sean resistentes. Este artículo proporciona una guía para lograr aplicaciones resistentes. Se aplica a ASP.NET Core, ASP.NET y Microsoft.IdentityModel.

ASP.NET Core

Use la versión más reciente de Microsoft.IdentityModel.* y siga manualmente las instrucciones siguientes.

En el método ConfigureServices de Startup.cs, asegúrese de que JwtBearerOptions.RefreshOnIssuerKeyNotFound está establecido en true y de que usa la biblioteca de Microsoft.IdentityModel.* más reciente. Esta propiedad debe estar habilitada de forma predeterminada.

services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
    …
    // shouldn’t be necessary as it’s true by default
    options.RefreshOnIssuerKeyNotFound = true;
    …
});

OWIN de ASP.NET/

Microsoft recomienda pasar a ASP.NET Core, ya que el desarrollo se ha detenido en ASP.NET.

Si usa ASP.NET (Clásico), use la versión más reciente de Microsoft.IdentityModel.*.

OWIN tiene un intervalo de actualización automática de 24 horas para el objeto OpenIdConnectConfiguration. Esta actualización solo se desencadenará si se recibe una solicitud una vez transcurrido el intervalo de tiempo de 24 horas. Por lo que sabemos, no hay ninguna manera de cambiar este valor o desencadenar una actualización anticipada, aparte de reiniciar la aplicación.

Microsoft.IdentityModel

Si valida el token usted mismo, por ejemplo, en una instancia de Azure Functions, use la versión más reciente de Microsoft.IdentityModel.* y siga las instrucciones de metadatos que se muestran en los fragmentos de código siguientes.

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);
}

Pasos siguientes

Para más información, consulte Validación de tokens en una API web protegida.