首页 > 解决方案 > MSOnline 无法加载类型“System.IdentityModel.Tokens.JwtSecurityToken”

问题描述

我有一个使用MSOnlinePowerShell 模块与 Office 365 交互的 asp.net 核心 Web 应用程序。当Connect-MsolService执行 cmdlet 以使用 Office 365 进行身份验证时,我收到以下错误。

无法从程序集“System.IdentityModel.Tokens.Jwt,版本=5.1.5.0,文化=中性,PublicKeyToken=31bf3856ad364e35”加载类型“System.IdentityModel.Tokens.JwtSecurityToken”。

通过单元测试在另一个项目中运行相同的逻辑时,我没有收到错误,代码按预期执行。测试项目和 Web 项目都使用相同版本(5.1.5)的System.IdentityModel.Tokens.Jwt程序集,所以我不明白为什么在 Web 应用程序中执行该逻辑时会出现此错误。

我读过一个解决方案是降级到System.IdentityModel.Tokens.Jwt程序集的 v4,但我知道它适用于 5.1.5,因为我的测试通过了。此外,这对我来说不是一个选项,因为一些 aspnetcore 程序集需要 v5。有谁知道为什么会在 asp.net 核心网络应用程序中发生这种情况,或者知道不需要降级程序集的解决方案?

更新:

看起来我的绑定重定向导致了问题。如果我将以下内容添加到我的测试项目中的 app.config 文件中,则会产生错误。这很奇怪,因为 5.1.5 是System.IdentityModel.Tokens.Jwt引用的版本,就好像默认使用不同的版本一样。

  <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-5.4.0.0" newVersion="5.1.5.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

标签: powershellasp.net-corejwtoffice365

解决方案


我最终通过消除System.IdentityModel.Tokens.Jwt. 绑定重定向是自动创建的,因为我正在使用该Auto-generate binding redirects选项。我决定禁用该选项并手动管理绑定重定向以消除不需要的重定向。

为了简单起见,我只是从输出配置文件中复制了自动生成的绑定重定向并将它们粘贴到我的项目 app.config 文件中。然后,我删除了System.IdentityModel.Tokens.Jwt重定向并Auto-generate binding redirects禁用了该选项,它只使用了我的 app.config 文件中的重定向,而不是生成它们,从而解决了问题。

我仍然不明白为什么重定向会导致该错误,希望有人最终会对此有所了解,但幸运的是我找到了解决方法。

需要注意的一点是,如果您的任何依赖项使用该程序集的不同版本,这显然是行不通的。幸运的是,情况并非如此,至少现在是这样。


推荐阅读