VS2017 MVC5应用发布目录设引用项目独立文件夹及JWT版本冲突问询
问题2:解决System.IdentityModel.Tokens.Jwt版本冲突及ADFS身份验证配置
这个版本冲突是OWIN 3.x和新版JWT组件的典型兼容问题,核心是OWIN依赖的旧版JWT组件和你的公共项目高版本组件不兼容。下面是一步步的解决办法:
1. 配置程序集绑定重定向(强制统一版本)
这是解决.NET程序集版本冲突的标准方案,在主项目的Web.config中添加以下配置,把所有对旧版本System.IdentityModel.Tokens.Jwt的请求重定向到你公共项目使用的版本(比如5.1.4):
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <!-- 替换newVersion为你的公共项目使用的版本号 --> <bindingRedirect oldVersion="0.0.0.0-5.1.4.0" newVersion="5.1.4.0" /> </dependentAssembly> <!-- 若还有Microsoft.IdentityModel.Protocols等相关组件冲突,同样添加重定向 --> <dependentAssembly> <assemblyIdentity name="Microsoft.IdentityModel.Protocols" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.1.4.0" newVersion="5.1.4.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
这一步会让整个应用强制使用高版本的JWT组件,忽略OWIN依赖的旧版本。
2. 适配ADFS身份验证的配置代码
因为用了高版本的JWT组件,你需要调整ADFS的OWIN配置,确保兼容:
- 首先确保主项目安装的
Microsoft.Owin.Security.WsFederation版本和OWIN 3.1.0.0兼容(建议安装3.1.0版本的该包) - 然后在
Startup.Auth.cs中调整配置,复用公共项目的JWT处理逻辑:
using System.IdentityModel.Tokens.Jwt; using Microsoft.Owin.Security; using Microsoft.Owin.Security.WsFederation; public void ConfigureAuth(IAppBuilder app) { // 禁用默认声明映射,避免和新版JWT组件冲突 JwtSecurityTokenHandler.DefaultMapInboundClaims = false; app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions { MetadataAddress = "https://your-adfs-server/FederationMetadata/2007-06/FederationMetadata.xml", Wtrealm = "your-app-realm-uri", // 替换为你的应用在ADFS中的Realm TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = "https://your-adfs-server/adfs/services/trust", // ADFS的Issuer URI // 这里可以复用公共项目中定义的TokenValidationParameters配置 } }); }
3. 检查并清理NuGet依赖
- 打开主项目的NuGet包管理器,确保
Microsoft.Owin系列包版本统一为3.1.0.0,避免混合版本 - 公共项目只保留
System.IdentityModel.Tokens.Jwt(≥5.1.4),不要引入OWIN相关包,避免依赖混乱 - 如果安装包时出现警告,优先选择"接受更新"但保留OWIN核心版本,或手动调整包版本
4. 测试验证
- 先在本地运行项目,检查是否有
FileNotFoundException或AssemblyLoadException(可查看Visual Studio输出窗口) - 测试ADFS登录流程,确保身份验证正常跳转,用户信息能正确获取
- 测试公共项目的JWT功能(比如生成、验证JWT),确保和ADFS身份验证共存时无冲突
内容的提问来源于stack exchange,提问作者3not3
相关产品推荐
相关产品推荐

