Comparteix a través de


Los eventos de token de seguridad devuelven un JsonWebToken

JwtBearerEvents, WsFederationEvents y OpenIdConnectEvents son eventos de autenticación desencadenados respectivamente por los controladores de autenticación JwtBearer, WsFederation y OpenIdConnect. Por ejemplo, el evento OnTokenValidated se desencadena cuando se valida un token de seguridad. Estos eventos se desencadenan con un contexto (por ejemplo, TokenValidatedContext) que expone una propiedad TokenValidatedContext.SecurityToken de tipo abstracto SecurityToken. La implementación real predeterminada de TokenValidatedContext.SecurityToken se ha cambiado de JwtSecurityToken a JsonWebToken.

Versión introducida

ASP.NET Core 8.0 Versión preliminar 7

Comportamiento anterior

Anteriormente, las propiedades de SecurityToken afectadas las implementaba JwtSecurityToken, que deriva de SecurityToken. JwtSecurityToken es la generación anterior de la implementación de JSON Web Token (JWT). Los tokens JwtSecurityToken se generaban con SecurityTokenValidators.

Además, el campo JwtSecurityTokenHandler.DefaultInboundClaimTypeMap proporcionaba la asignación de tipos de notificación predeterminada para las notificaciones entrantes.

Comportamiento nuevo

A partir de ASP.NET Core 8.0, la clase Microsoft.IdentityModel.JsonWebTokens, que también se deriva de SecurityToken, implementa las propiedades SecurityToken de forma predeterminada. Los tokens Microsoft.IdentityModel.JsonWebTokens los generan controladores TokenHandler más optimizados.

Además, el campo JsonWebTokenHandler.DefaultInboundClaimTypeMap proporciona la asignación de tipos de notificación predeterminada para las notificaciones entrantes.

Tipo de cambio importante

Este es un cambio de comportamiento.

Motivo del cambio

Este cambio se ha realizado porque JsonWebToken (y su JsonWebTokenHandler asociado) aportan las siguientes ventajas:

  • Mejora del rendimiento en un 30 %.
  • Mayor confiabilidad gracias al uso de metadatos de tipo "última configuración correcta conocida" (por ejemplo, OpenIdConnectMetadata).
  • Procesamiento asincrónico.

Para la mayoría de los usuarios, este cambio no debería ser un problema, ya que el tipo de las propiedades (SecurityToken) no ha cambiado y se supone que no tiene que ver el tipo real.

Sin embargo, si estaba convirtiendo una de las propiedades SecurityToken afectadas en JwtSecurityToken (por ejemplo, para obtener las notificaciones), tiene dos opciones:

  • Convertir la propiedad en JsonWebToken:

    service.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options => {
        options.Events.OnTokenValidated = (context) => {
            // Replace your cast to JwtSecurityToken.
            JsonWebToken token = context.SecurityToken as JsonWebToken;
            // Do something ...
        };
    });
    
  • Establecer una de las propiedades UseSecurityTokenValidators booleanas de las opciones correspondientes (JwtBearerOptions, WsFederationOptions o OpenIdConnectOptions) en true. Al establecer la propiedad en true, los controladores de autenticación seguirán usando JwtTokenValidators y produciendo tokens JwtSecurityToken.

    service.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme,  options => {
        options.UseSecurityTokenValidators = true;
        options.Events.OnTokenValidated = (context) => {
            // As you were doing before
            JwtSecurityToken token = context.SecurityToken as JwtSecurityToken;
            // Do something ...
        };
    });
    

API afectadas