在WebAPI2项目中加载System.IdentityModel.Tokens.Jwt dll时出错

时间:2015-12-22 07:25:43

标签: asp.net-web-api2 owin jwt

我在WebApi2项目中遇到以下错误:

无法加载文件或程序集'System.IdentityModel.Tokens.Jwt,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其中一个依赖项。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT异常:0x80131040)

我安装了这些相关的NuGet包以及其他一些包:

“Microsoft.IdentityModel.Protocol.Extensions”version =“1.0.2.206221351”targetFramework =“net45”

“Microsoft.Owin”version =“3.0.1”targetFramework =“net45”

“Microsoft.Owin.Host.SystemWeb”version =“3.0.1”targetFramework =“net45”

“Microsoft.Owin.Security”version =“3.0.1”targetFramework =“net45”

“Microsoft.Owin.Security.ActiveDirectory”version =“3.0.1”targetFramework =“net45”

“Microsoft.Owin.Security.Jwt”version =“3.0.1”targetFramework =“net45”

“Microsoft.Owin.Security.OAuth”version =“3.0.1”targetFramework =“net45”

“System.IdentityModel.Tokens.Jwt”version =“4.0.2.206221351”targetFramework =“net45”

顺便说一句,我的web.config中也有以下绑定重定向,但它仍然试图加载4.0版本。

  <dependentAssembly>
    <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.20622.1351" newVersion="4.0.20622.1351" />
  </dependentAssembly>

任何有关故障排除的帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:26)

我遇到了完全相同的麻烦。

原因是,最新版本的System.IdentityModel.Tokens.Jwt和S​​ystem.IdentityModel.Tokens有一些NuGet版本mishmash,它们与启动UseJwtBearerAuthentication方法不兼容,后者需要System.IdentityModel v.4.0.0.0

如果你正在使用nuget,你很容易混淆,因为:

System.IdentityModel.Tokens在nuget中可用,就像预发布5.0.0.112(nowdays)一样

System.IdentityModel.Tokens.Jwt nuget最新版本可作为预发布版本5.0.0.112或4.0.2.206221351稳定。

但是,在WebAPI中设置JWT身份验证

app.UseJwtBearerAuthentication(new JwtOptions());

需要System.IdentityModel版本4.0.0.0。

我的工作解决方案是:

1)卸载以前安装的System.IdentityModel.Tokens nuget package

Uninstall-Package System.IdentityModel.Tokens

2)卸载最新的System.IdentityModel.Tokens.Jwt nuget包

Uninstall-Package System.IdentityModel.Tokens.Jwt

3)安装System.IdentityModel.Tokens.Jwt版本4.0.2.206221351(最新稳定版)

Install-Package System.IdentityModel.Tokens.Jwt -Version 4.0.2.206221351

4)向.NET框架程序集System.IdentityModel添加引用(不是nuget!)。右键单击项目 - &gt;参考文献 - &gt;添加参考 - &gt;装配 - &gt;框架 - &gt;选择System.IdentityModel 4.0.0.0

根据您已经安装/卸载的内容,某些步骤可能会有所不同。

答案 1 :(得分:6)

在我的案例中添加binding redirect有帮助。

我有一个Windows服务应用程序,它使用 Microsoft.Owin.Security.Jwt(3.0.1) System.IdentityModel.Tokens.Jwt(4.0.20622.1351);我可以看到, Microsoft.Owin.Security.Jwt(3.0.1)引用了 System.IdentityModel.Tokens.Jwt(4.0.0) {{3 }}:

app.UseJwtBearerAuthentication(new CustomJwtOptions());

上述异常恰好在调用时发生:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- ... -->
<runtime>
    <!-- ... -->
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <!-- ... -->
        <dependentAssembly>
            <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" 
                              publicKeyToken="31bf3856ad364e35" 
                              culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.20622.1351" 
                             newVersion="4.0.20622.1351" />
        </dependentAssembly>
        <!-- ... -->
    </assemblyBinding>
    <!-- ... -->
</runtime>
<!-- ... -->
</configuration>

所以我可以得出结论, Microsoft.Owin.Security.Jwt(3.0.1)包试图加载 System.IdentityModel.Tokens.Jwt(4.0.0)

修改

我们有简单的.net应用程序,它与app.exe.config文件一起分发。修改文件有助于解决上述问题:

<script src="./../../js/all.js" charset="utf-8"></script>