Подтвердить что ты не робот

Ошибка при загрузке файла System.IdentityModel.Tokens.Jwt в проекте WebAPI2

Я получаю ошибку ниже в проекте 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"

Btw, у меня есть еще одна переадресация ссылок в моем 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>

Любая помощь в поиске и устранении неисправностей будет высоко оценена.

4b9b3361

Ответ 1

Я столкнулся с такими же проблемами.

Причина в том, что в последних версиях System.IdentityModel.Tokens.Jwt и System.IdentityModel.Tokens есть некоторые версии nishGet mishmash, и они несовместимы с методом запуска UseJwtBearerAuthentication, который требует System.IdentityModel v. 4.0.0.0.

Если вы используете nuget, вас можно легко смутить, потому что:

System.IdentityModel.Tokens доступен в nuget так же, как и перед выпуском 5.0.0.112 (сейчас)

System.IdentityModel.Tokens.Jwt последняя версия в nuget доступна как предварительная версия 5.0.0.112 или 4.0.2.206221351 стабильная.

НО, когда вы устанавливаете аутентификацию JWT в WebAPI

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) добавьте ссылку (не nuget!) в сборку .NET Framework System.IdentityModel. Щелкните правой кнопкой мыши по проекту → Ссылки → Добавить ссылку → Ассембли → Рамки → выберите System.IdentityModel 4.0.0.0

Некоторые шаги могут отличаться в зависимости от того, что вы уже установили/удалили.

Ответ 2

В моем случае добавление привязки переадресации помогает.

У меня есть приложение для 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) [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)

ИЗМЕНИТЬ

У нас есть простое .net-приложение, которое распространяется с файлом app.exe.config. Изменение файла помогает решить указанную проблему:

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