web-dev-qa-db-ja.com

WebAPI2プロジェクトでのSystem.IdentityModel.Tokens.Jwt dllの読み込みエラー

WebApi2プロジェクトで以下のエラーが発生します。

ファイルまたはアセンブリ 'System.IdentityModel.Tokens.Jwt、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。 (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>

トラブルシューティングの助けをいただければ幸いです。

14
SteelBird82

私はまったく同じトラブルに遭遇しました。

その理由は、System.IdentityModel.Tokens.JwtとSystem.IdentityModel.Tokensの最新バージョンにはいくつかのNuGetバージョンmishmashがあり、System.IdentityModel v。4.0.0.0を必要とするスタートアップUseJwtBearerAuthenticationメソッドと互換性がないためです。

Nugetを使用している場合は、次の理由で簡単に混乱する可能性があります。

System.IdentityModel.Tokensは、プレリリース5.0.0.112(現在)と同様にnugetで使用できます

System.IdentityModel.Tokens.Jwt nugetの最新バージョンは、プレリリースバージョン5.0.0.112として入手できますOR 4.0.2.206221351安定版。

ただし、WebAPIでJWT認証を設定する場合

app.UseJwtBearerAuthentication(new JwtOptions());

System.IdentityModelバージョン4.0.0.0が必要です。

私のための実用的な解決策は:

1)以前にインストールしたSystem.IdentityModel.Tokens nugetパッケージをアンインストールします

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フレームワークAssembly System.IdentityModelへの参照(nugetではない!)を追加します。プロジェクトを右クリック->参照->参照を追加->アセンブリ->フレームワーク-> System.IdentityModel 4.0.0.0を選択

一部の手順は、すでにインストール/アンインストールしたものによって異なる場合があります。

27
Tomino

私の場合、 binding redirect を追加すると役立ちます。

Microsoft.Owin.Security.Jwt(3.0.1)およびSystemを消費するWindowsサービスアプリケーションがあります.IdentityModel.Tokens.Jwt(4.0.20622.1351);ご覧のとおり、Microsoft.Owin.Security.Jwt(3.0.1)Systemを参照しています。 IdentityModel.Tokens.Jwt(4.0.0)[katanaproject]

<Reference Include="System.IdentityModel.Tokens.Jwt, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\..\packages\System.IdentityModel.Tokens.Jwt.4.0.0\lib\net45\System.IdentityModel.Tokens.Jwt.dll</HintPath>
</Reference>

上記の例外は、呼び出しが行われたときに正確に発生しました。

app.UseJwtBearerAuthentication(new CustomJwtOptions());

したがって、パッケージMicrosoft.Owin.Security.Jwt(3.0.1)Systemをロードしようとしていると結論付けることができます。 IdentityModel.Tokens.Jwt(4.0.0)

[〜#〜]編集[〜#〜]

App.exe.configファイルで配布されるシンプルな.netアプリがあります。ファイルの変更は、言及された問題の解決に役立ちます。

<?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>
6
stukselbax