'Jwt' 不存在于命名空间 System.IdentityModel.Tokens 中 - 仅在生产中

'Jwt' does not exist in the namespace System.IdentityModel.Tokens - in production only

我正在尝试在我的基于 Orchard CMS 的网站中启动一个 web-api 模块。 web-api 出于安全目的必须使用 JWT。

我制作了这样一个模块。在我的开发环境下离线构建编译,一切顺利。我能够查询 API 并得到一些结果。这里证明 API returns 我的开发环境中的 JWT Postman Response Screenshot

这很好,很漂亮。但是,当我尝试将模块上传到我现有的网站(基于 Orchard CMS)时,出现错误:

<directory>/JwtManager.cs(4): error CS0234: The type or namespace name 'Jwt' does not exist in the namespace 'System.IdentityModel.Tokens' (are you missing an assembly reference?)

参考程序集肯定包含在我正在创建的 nuget 包中(在 bin 目录中可见)。我在 Whosebug 上看到了关于 JWT 5.0.0.0+ 的程序集版本的其他问题,例如 - 但是 none 的问题出现了同样的错误。此外,我已经确认我的代码在构建中使用了正确的对象,例如。 SigningCredentials 和 SymmetricSecurityKey,所以我认为这些答案与我的具体情况无关。

我不太熟悉用参考程序集解决此类问题,所以如果这是一个简单的修复,我深表歉意。这是我尝试做的事情:

  1. 在构建 nuget 包之前,在我的项目中将 System.IdentityModel.Tokens.Jwt "Specific Version" 属性 设置为 true。同样的错误仍然存​​在。
  2. 修改 Web.Config 以在旧版本的 System.IdentityModel.Tokens.Jwt 程序集上使用 bindingRedirect。同样的错误仍然存​​在(该二进制文件的旧版本正在解决方案中的另一个项目中使用)。
  3. 删除using System.IdentityModel.Tokens.Jwt; 语句,并强烈定义任何依赖此using 语句的对象。有趣的是,在这样做的过程中,我没有在 eg 的声明中收到错误。 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler(); - 然而,我确实在 HttpActionResult 实现的 public string ReasonPhrase { get; } 行收到错误 must declare a body because it is not marked abstract or extern.

上面的第 3 点让我相信 ASP.Net 版本可能存在一些问题导致所有这些怪异(因为上面只是一个简单的 属性...),但我真的不是当然。我已确保目标框架在我的开发环境和在线环境 (.NET Framework 4.5.2) 上是相同的。

对我来说,none 是有道理的,因为在我的开发环境中一切都工作得很好,它建立在与我的在线环境相同版本的 OrchardCMS 上。

我在项目中使用的参考程序集:

非常感谢在此问题上的任何帮助 - 这个小问题在很大程度上阻碍了我的进步,我似乎无法解决问题![​​=26=]

附加信息: 我应该澄清一下,我们在这个问题中提到的 "production" 环境不维护我们的源代码版本。然而,我已经创建了一个单独的测试环境来反映我们的生产环境,并在那里安装了源代码。

请务必注意,通过 Orchard CMS 管理仪表板安装 NuGet 包是加载我们代码的机制。本题之前提到的所有线上环境都是指这个尝试加载这段代码的过程。

当我实际将包作为项目添加到我们的解决方案时,问题没有发生,我们的 web-api 实现在我们的测试环境中工作。

但是,这不是解决方案,因为我们没有也不会在生产环境中维护解决方案源的版本。但是,它可能会为知识渊博的人提供一些关于正在发生的事情的线索?

根据 Orchard's Module Loader documentation - 动态编译在我们的在线环境中仍然启用。我们的参考库有一个问题导致无法编译服务器端。我相信 VS 以某种方式掩盖了这个问题并允许编译仍然离线进行,因为我们的解决方案确实包含正确的参考。