.NET 6 Web API升级Microsoft.IdentityModel.Tokens后方法找不到问题
问题
我有一个.NET 6 Web API,使用以下代码验证JWT Bearer令牌:
objReturn = new JwtSecurityTokenHandler().ValidateToken(strJwtToken, new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = objSecurityKey, ClockSkew = TimeSpan.Zero }, out objSecurityToken);
该代码原本运行正常,但升级NuGet包后,从Microsoft.IdentityModel.Tokens 6.29版本开始,所有该版本及以上版本都会出现如下错误:
{"Method not found: 'Boolean Microsoft.IdentityModel.Tokens.TokenUtilities.IsRecoverableConfiguration(Microsoft.IdentityModel.Tokens.TokenValidationParameters, Microsoft.IdentityModel.Tokens.BaseConfiguration, Microsoft.IdentityModel.Tokens.BaseConfiguration ByRef)'."}
奇怪的是,我在NuGet页面链接的GitHub源码仓库中仍能找到该方法。
更新说明:我使用了Jason Watmore网站上的JWT令牌验证示例。
原因与解决办法
原因
这是典型的程序集版本冲突问题:
- Microsoft.IdentityModel.Tokens 6.29+版本对
TokenUtilities.IsRecoverableConfiguration方法的签名或内部调用逻辑做了调整,但你的项目中可能存在其他依赖包(比如Microsoft.AspNetCore.Authentication.JwtBearer)引用了该方法的旧版本,导致运行时无法找到匹配的方法实现。 - 或者项目中同时加载了多个版本的Microsoft.IdentityModel.Tokens程序集,运行时选择了不兼容的版本。
解决步骤
- 统一相关NuGet包版本:确保项目中
Microsoft.IdentityModel.Tokens和所有依赖它的包(例如Microsoft.AspNetCore.Authentication.JwtBearer)版本完全一致。比如如果使用6.29.0版本的Tokens包,对应的JwtBearer包也要升级到相同版本。 - 清理项目缓存并重建:删除项目目录下的
bin和obj文件夹,执行dotnet nuget locals all --clear命令清除NuGet缓存,随后重新构建项目。 - 检查并修复依赖树:使用
dotnet list package --include-transitive命令查看所有直接和间接依赖的版本,排查是否有其他包引入了旧版本的Microsoft.IdentityModel.Tokens。必要时通过项目文件中的<PackageReference>节点强制指定版本,或使用PrivateAssets="all"隔离冲突依赖。 - 切换到官方推荐的验证方式:如果是手动调用
JwtSecurityTokenHandler.ValidateToken,建议改用ASP.NET Core内置的JWT中间件配置,该方式会自动处理版本兼容问题,示例代码如下:builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = objSecurityKey, ClockSkew = TimeSpan.Zero }; });
内容的提问来源于stack exchange,提问作者J Weezy
相关产品推荐
相关产品推荐

