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