安全令牌事件返回 JsonWebToken

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

引入的版本

ASP.NET Core 8.0 预览版 7

旧行为

以前,受影响的 SecurityToken 属性是由从 SecurityToken 派生的 JwtSecurityToken 实现的。 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 ...
        };
    });
    
  • 将相应选项(JwtBearerOptionsWsFederationOptionsOpenIdConnectOptions)上的其中一个 UseSecurityTokenValidators 布尔属性设置为 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