安全令牌事件返回 JSonWebToken

JwtBearerEventsWsFederationEventsOpenIdConnectEvents 事件分别是由 JwtBearerWsFederationOpenIdConnect 身份验证处理程序触发的身份验证事件。 例如,安全令牌被验证时,会触发OnTokenValidated事件。 这些事件是通过上下文(例如 TokenValidatedContext)触发的,该上下文公开 TokenValidatedContext.SecurityToken 抽象类型的 SecurityToken 属性。 默认实际实现TokenValidatedContext.SecurityToken已从JwtSecurityToken更改为JsonWebToken

已引入的版本

ASP.NET Core 8.0 预览版 7

以前的行为

以前,受影响的 SecurityToken 属性是由从 JwtSecurityToken 派生的 SecurityToken 实现的。 JwtSecurityToken 是上一代 JSON Web 令牌 (JWT) 实现。 JwtSecurityToken 令牌由 SecurityTokenValidators 生成。

此外,该 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap 字段为入站声明提供了默认声明类型映射。

新行为

从 ASP.NET Core 8.0 开始, Microsoft.IdentityModel.JsonWebTokens 默认情况下,派生自 SecurityToken的类将实现 SecurityToken 属性。 Microsoft.IdentityModel.JsonWebTokens 令牌由更优化的 TokenHandler 处理程序生成。

此外,该 JsonWebTokenHandler.DefaultInboundClaimTypeMap 字段还提供入站声明的默认声明类型映射。

破坏性变更的类型

此更改为行为更改

更改原因

之所以进行此更改,是因为 JsonWebToken (及其关联的 JsonWebTokenHandler)具有以下优势:

  • 性能提高 30%。
  • 通过使用“最新可用的”元数据(例如 OpenIdConnectMetadata),提高了可靠性。
  • 异步处理。

对于大多数用户来说,此更改不应是问题,因为属性类型(SecurityToken)尚未更改,因此不应查看实际类型。

但是,如果将其中一个受影响的 SecurityToken 属性向下强制转换为 JwtSecurityToken(例如,获取声明),则有两个选项:

  • 将属性向下强制转换为 JsonWebToken

    service.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options => {
        options.Events.OnTokenValidated = (context) => {
            // Replace your cast to JwtSecurityToken.
            JsonWebToken token = context.SecurityToken as JsonWebToken;
            // Do something ...
        };
    });
    
  • 将相应选项(UseSecurityTokenValidatorsJwtBearerOptionsWsFederationOptions)上的布尔属性之一OpenIdConnectOptions设置为true。 通过将属性设置为 true,身份验证处理程序将继续使用 JwtTokenValidators ,并将继续生成 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