调用JwtSecurityToken.WriteToken抛出类型初始值设定项异常求助
统一NuGet包版本
解决方案内3个项目可能存在包版本不一致的情况,尤其是Microsoft.IdentityModel.Tokens和Newtonsoft.Json。打开NuGet包管理器的“管理解决方案的NuGet程序包”界面,确保所有项目(即使未直接使用Token功能的项目)的这两个包版本完全一致;对于不相关的项目,可直接卸载这两个包,避免跨项目的程序集冲突。检查并修复程序集绑定重定向
查看使用Token功能项目的app.config或web.config,确认是否存在针对Newtonsoft.Json和Microsoft.IdentityModel.Tokens的绑定重定向配置,确保重定向到当前使用的包版本。示例配置:<dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.IdentityModel.Tokens" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.32.0.0" newVersion="6.32.0.0" /> </dependentAssembly>若没有配置,可右键项目→属性→应用程序,勾选“自动生成绑定重定向”,让Visual Studio自动生成正确的重定向规则。
清理缓存并彻底重建项目
- 删除所有项目下的
bin、obj文件夹,清除编译残留文件; - 打开NuGet包管理器设置,清除所有NuGet缓存;
- 重新生成整个解决方案,避免旧程序集干扰。
- 删除所有项目下的
排查JwtPayload的序列化问题
异常触发于JwtPayload.SerializeToJson(),大概率是Payload中包含无法正常序列化的内容(比如循环引用、未标记可序列化的自定义类型)。可在生成Token前,手动序列化Payload内容测试:// 在handler.WriteToken(token)前添加测试代码 var testJson = Newtonsoft.Json.JsonConvert.SerializeObject(token.Payload);若此代码抛出异常,可定位到具体的问题字段,调整Payload内容后再尝试生成Token。
确认目标框架兼容性
检查使用Token功能项目的目标框架版本,确保与Microsoft.IdentityModel.Tokens包的支持范围匹配。例如部分新版本的包不再支持.NET Framework 4.5及以下版本,需调整项目框架或更换兼容版本的包。
内容的提问来源于stack exchange,提问作者Sonnich Jensen

