MSOnline无法加载类型'System.IdentityModel.Tokens.JwtSecurityToken'

时间:2019-02-23 01:10:37

标签: powershell asp.net-core jwt office365

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

  

无法从程序集'System.IdentityModel.Tokens.Jwt,Version = 5.1.5.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'中加载类型'System.IdentityModel.Tokens.JwtSecurityToken'。

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

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

更新

看来我的绑定重定向导致了问题。如果将以下内容添加到测试项目中的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>

2 个答案:

答案 0 :(得分:0)

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

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

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

需要注意的一件事是,如果您的任何依赖项使用了该程序集的不同版本,那么这显然将不起作用。对我来说幸运的是,至少现在不是这样。

答案 1 :(得分:0)

我设法通过更新程序集绑定使之起作用,以排除System.IdentityModel.Tokens.Jwt正在使用的Connect-MsolService的版本。这工作了。我更新的程序集绑定是:

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