安全令牌事件返回 JsonWebToken
JwtBearerEvents、WsFederationEvents 和 OpenIdConnectEvents 事件是分别由 JwtBearer、WsFederation 和 OpenIdConnect 身份验证处理程序触发的身份验证事件。 例如,在验证安全令牌时会触发 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 ... }; });
将相应选项(JwtBearerOptions、WsFederationOptions 或 OpenIdConnectOptions)上的其中一个
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
- Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenValidatedContext.SecurityToken
- Microsoft.AspNetCore.Authentication.JwtBearer.TokenValidatedContext.SecurityToken
- Microsoft.AspNetCore.Authentication.OpenIdConnect.TokenValidatedContext.SecurityToken
- AuthorizationCodeReceivedContext.SecurityToken