web-dev-qa-db-fra.com

Erreur lors du chargement de la DLL System.IdentityModel.Tokens.Jwt dans le projet WebAPI2

J'obtiens l'erreur ci-dessous dans le projet WebApi2:

Impossible de charger le fichier ou l'assembly 'System.IdentityModel.Tokens.Jwt, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' ou l'une de ses dépendances. La définition du manifeste de l'assembly localisé ne correspond pas à la référence de l'assembly. (Exception de HRESULT: 0x80131040)

J'ai installé cet ensemble de packages NuGet connexes, ainsi qu'un tas d'autres:

"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"

Btw, j'ai aussi la redirection de liaison ci-dessous dans mon web.config mais il essaie toujours de charger la version 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>

Toute aide au dépannage serait très appréciée.

14
SteelBird82

J'ai rencontré exactement les mêmes problèmes.

La raison en est que les dernières versions de System.IdentityModel.Tokens.Jwt et System.IdentityModel.Tokens ont certaines versions de NuGet mishmash et qu'elles ne sont pas compatibles avec la méthode de démarrage UseJwtBearerAuthentication qui nécessite System.IdentityModel v. 4.0.0.0.

Si vous utilisez nuget, vous pouvez facilement être confondu, car:

System.IdentityModel.Tokens est disponible dans nuget tout comme la version préliminaire 5.0.0.112 (aujourd'hui)

System.IdentityModel.Tokens.Jwt la dernière version de nuget est disponible en version préliminaire 5.0.0.112 OR 4.0.2.206221351 stable.

MAIS, lorsque vous définissez l'authentification JWT dans WebAPI

app.UseJwtBearerAuthentication(new JwtOptions());

La version 4.0.0.0 de System.IdentityModel est requise.

La solution de travail pour moi est:

1) Désinstaller le package de nuget System.IdentityModel.Tokens précédemment installé

Uninstall-Package System.IdentityModel.Tokens

2) Désinstaller le dernier paquet de nuget System.IdentityModel.Tokens.Jwt

Uninstall-Package System.IdentityModel.Tokens.Jwt

3) installez System.IdentityModel.Tokens.Jwt version 4.0.2.206221351 (dernière version stable)

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

4) ajouter une référence (pas nuget!) À System.IdentityModel .NET Framework Assembly System. Faites un clic droit sur le projet -> Références -> Ajouter une référence -> Assemblages -> Framework -> sélectionnez System.IdentityModel 4.0.0.0

Certaines étapes peuvent différer selon ce que vous avez déjà installé/désinstallé.

27
Tomino

Dans mon cas, l'ajout de redirection de liaison aide.

J'ai une application de service Windows, qui consomme Microsoft.Owin.Security.Jwt (3.0.1) et System .IdentityModel.Tokens.Jwt (4.0.20622.1351) ; Comme je peux le voir, Microsoft.Owin.Security.Jwt (3.0.1) fait référence au système . 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>

L'exception mentionnée ci-dessus s'est produite exactement au moment de l'appel:

app.UseJwtBearerAuthentication(new CustomJwtOptions());

Je peux donc conclure que le package Microsoft.Owin.Security.Jwt (3.0.1) essaie de charger le système. IdentityModel.Tokens.Jwt (4.0.0)

[~ # ~] modifier [~ # ~]

Nous avons une simple application .net, qui est distribuée avec le fichier app.exe.config. La modification du fichier permet de résoudre le problème mentionné:

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