添加OwinStartup特性后出现Microsoft.IdentityModel.Protocols.WsFederation加载失败错误
咱先还原下你的场景:你只在Startup.cs里添加了Owin的程序集特性行,就触发了程序集加载错误。先把你的代码和配置贴出来方便参考:
你的Startup.cs代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.Owin; using Owin; [assembly: OwinStartupAttribute(typeof(InnovationInABoxWebApi.App_Start.Startup))] namespace InnovationInABoxWebApi.App_Start { public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); } } }
项目的packages.config配置
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Antlr" version="3.4.1.9004" targetFramework="net45" /> <package id="bootstrap" version="3.0.0" targetFramework="net45" /> <package id="jQuery" version="1.10.2" targetFramework="net45" /> <package id="Microsoft.ApplicationInsights" version="2.2.0" targetFramework="net45" /> <package id="Microsoft.ApplicationInsights.Agent.Intercept" version="2.0.6" targetFramework="net45" /> <package id="Microsoft.ApplicationInsights.DependencyCollector" version="2.2.0" targetFramework="net45" /> <package id="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.2.0" targetFramework="net45" /> <package id="Microsoft.ApplicationInsights.Web" version="2.2.0" targetFramework="net45" /> <package id="Microsoft.ApplicationInsights.WindowsServer" version="2.2.0" targetFramework="net45" /> <package id="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.2.0" targetFramework="net45" /> <package id="Microsoft.AspNet.Cors" version="5.2.5" targetFramework="net451" /> <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" /> <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" /> <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.Client" version="5.2.5" targetFramework="net451" /> <package id="Microsoft.AspNet.WebApi.Core" version="5.2.5" targetFramework="net451" /> <package id="Microsoft.AspNet.WebApi.Cors" version="5.2.5" targetFramework="net451" /> <package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.3" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" /> <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" /> <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.8" targetFramework="net45" /> <package id="Microsoft.IdentityModel.Logging" version="5.2.1" targetFramework="net451" /> <package id="Microsoft.IdentityModel.Tokens" version="5.2.1" targetFramework="net451" /> <package id="Microsoft.Net.Compilers" version="1.3.2" targetFramework="net45" developmentDependency="true" /> <package id="Microsoft.Owin" version="4.0.0" targetFramework="net451" /> <package id="Microsoft.Owin.Host.SystemWeb" version="4.0.0" targetFramework="net451" /> <package id="Microsoft.Owin.Security" version="4.0.0" targetFramework="net451" /> <package id="Microsoft.Owin.Security.ActiveDirectory" version="4.0.0" targetFramework="net451" /> <package id="Microsoft.Owin.Security.Jwt" version="4.0.0" targetFramework="net451" /> <package id="Microsoft.Owin.Security.OAuth" version="4.0.0" targetFramework="net451" /> <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" /> <package id="Modernizr" version="2.6.2" targetFramework="net45" /> <package id="Newtonsoft.Json" version="10.0.1" targetFramework="net451" /> <package id="Owin" version="1.0" targetFramework="net451" /> <package id="Respond" version="1.2.0" targetFramework="net45" /> <package id="System.IdentityModel.Tokens.Jwt" version="5.2.1" targetFramework="net451" /> <package id="WebGrease" version="1.5.2" targetFramework="net45" /> </packages>
错误信息
无法加载文件或程序集'Microsoft.IdentityModel.Protocols.WsFederation, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'或其依赖项之一。系统找不到指定的文件。
说明:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以了解有关错误的详细信息以及错误在代码中的来源。
异常详细信息:System.IO.FileNotFoundException: 无法加载文件或程序集“Microsoft.IdentityModel.Protocols.WsFederation, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或其依赖项之一。系统找不到指定的文件。
源错误:执行当前Web请求期间生成了未处理的异常。可以使用堆栈跟踪识别异常的起源和位置。
问题根源分析
这个错误的核心原因很明确:你的项目缺少了Microsoft.IdentityModel.Protocols.WsFederation这个NuGet包。
你安装的Microsoft.Owin.Security.ActiveDirectory和Microsoft.Owin.Security.Jwt(版本4.0.0)依赖这个程序集的5.2.x版本,但从你的packages.config可以看到,你只安装了同系列的Microsoft.IdentityModel.Tokens和System.IdentityModel.Tokens.Jwt,唯独漏了WsFederation包。当你添加OwinStartup特性后,Owin初始化时会尝试加载身份验证相关的依赖,自然就找不到这个缺失的程序集了。
具体解决方案
1. 安装匹配版本的缺失包
打开NuGet包管理器控制台,执行以下命令安装和你现有Identity组件版本一致的包:
Install-Package Microsoft.IdentityModel.Protocols.WsFederation -Version 5.2.1
选择5.2.1版本是因为你已有的Microsoft.IdentityModel.Tokens就是这个版本,能完美避免版本冲突。
2. (可选)添加程序集绑定重定向
如果安装后仍然出现版本不匹配的警告或错误,可以在项目的web.config中添加绑定重定向,强制系统使用你安装的版本:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!-- 其他绑定重定向 --> <dependentAssembly> <assemblyIdentity name="Microsoft.IdentityModel.Protocols.WsFederation" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.2.1.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
3. (可选)同步所有Identity相关包版本
要是你想彻底杜绝版本不一致的问题,可以把所有Microsoft Identity系列的包(包括刚安装的WsFederation)都更新到同一兼容版本,注意要和你的Owin 4.0.0版本适配(Owin 4.x兼容IdentityModel 5.x系列)。
内容的提问来源于stack exchange,提问作者Luis Valencia

