.NET 6 Web API加载Microsoft.IdentityModel.Tokens及JWT运行时错误排查
一、原问题:无法加载Microsoft.IdentityModel.Tokens程序集(版本6.29.0.0)
针对仅开发环境正常、其他环境加载失败的情况,排查方向如下:
检查发布目录依赖完整性
登录问题环境服务器,查看发布目录下是否存在Microsoft.IdentityModel.Tokens.dll和System.IdentityModel.Tokens.Jwt.dll,且版本为6.29.0.0。若缺失,重新发布时确保勾选“包含所有依赖项”,或在.csproj中对这两个包添加PrivateAssets="none",强制发布时包含依赖文件。禁用GAC全局程序集缓存加载
若服务器GAC中存在旧版本的Microsoft.IdentityModel.Tokens,会优先加载GAC中的程序集导致版本不匹配。在项目的.csproj文件中添加以下配置:<PropertyGroup> <DisableGac>true</DisableGac> </PropertyGroup>重新发布后验证问题是否解决。
添加程序集绑定重定向
虽然.NET 6默认不依赖绑定重定向,但环境中存在多版本冲突时可尝试配置。在项目的runtimeconfig.template.json中添加以下内容:{ "runtimeOptions": { "assemblyBinding": { "dependencies": [ { "name": "Microsoft.IdentityModel.Tokens", "publicKeyToken": "31bf3856ad364e35", "version": "6.29.0.0" } ] } } }
二、更新后新问题:System.IdentityModel.Tokens.Jwt.JsonExtensions类型初始化异常
针对统一Nuget版本后出现的类型初始化错误,尝试以下方案:
严格匹配IdentityModel相关包版本
确保Microsoft.IdentityModel.Tokens和System.IdentityModel.Tokens.Jwt的版本完全一致,这两个包依赖耦合度极高,版本不匹配会导致底层类型初始化失败。卸载现有包后,重新安装相同版本的两个包。匹配Newtonsoft.Json的兼容版本
Microsoft.IdentityModel.Tokens6.29.0版本要求Newtonsoft.Json >=13.0.1,之前尝试的10-12版本不在兼容范围内,需安装13.0.1及以上的稳定版本。清理冲突的Newtonsoft.Json版本
检查发布目录下是否存在多个版本的Newtonsoft.Json.dll,若有则全部删除后重新发布,确保只保留指定版本的文件。也可在.csproj中添加以下配置强制统一版本:<PackageReference Include="Newtonsoft.Json" Version="13.0.3"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>排查Json配置干扰
检查Program.cs/Startup.cs中是否有自定义的Newtonsoft.Json配置(如修改JsonSerializerSettings),暂时注释相关配置代码,验证是否因配置错误导致类型初始化失败。
内容的提问来源于stack exchange,提问作者Sonnich Jensen

