【发布时间】:2018-07-22 04:19:51
【问题描述】:
我正在尝试在我的基于 Orchard CMS 的网站中启动一个 web-api 模块。出于安全目的,web-api 必须使用 JWT。
我已经制作了这样一个模块。在我的开发环境中离线构建和编译时,一切都成功了。我能够查询 API 并获得一些结果。这是证明 API 在我的开发环境中返回 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 目录中可见)。我在 StackOverflow 上看到了有关 JWT 5.0.0.0+ 的程序集版本的其他问题,例如here - 但是没有一个问题出现相同的错误。此外,我已经确认我的代码在构建中使用了正确的对象,例如。 SigningCredentials 和 SymmetricSecurityKey,所以我认为这些答案与我的特定情况无关。
我不太熟悉使用参考程序集解决此类问题,所以如果这是一个简单的解决方法,我深表歉意。这是我尝试做的事情:
- 在构建 nuget 包之前,在我的项目中将
System.IdentityModel.Tokens.Jwt“特定版本”属性设置为true。同样的错误仍然存在。 - 修改 Web.Config 以在旧版本的
System.IdentityModel.Tokens.Jwt程序集上使用bindingRedirect。相同的错误仍然存在(此二进制文件的旧版本正在解决方案中的另一个项目中使用)。 - 删除
using System.IdentityModel.Tokens.Jwt;语句,并强烈定义任何依赖此 using 语句的对象。有趣的是,在这样做时,我没有收到例如声明中的错误。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)上是相同的。
对我来说,这没有任何意义,因为在我的开发环境中一切都运行良好,该开发环境建立在与我的在线环境相同版本的 OrchardCMS 上。
我在项目中使用的参考程序集:
-
System.IdentityModel.Tokens.Jwt- v5.1.5.0 -
Microsoft.IdentityModel.Tokens- v5.1.5.0
非常感谢您对此事的任何帮助 - 这个小障碍在很大程度上阻碍了我的进步,而我似乎无法解决问题!
其他信息: 我应该澄清一下,这个问题中提到的我们的“生产”环境不维护我们的源代码版本。然而,我创建了一个单独的测试环境来反映我们的生产环境,并在那里安装了源代码。
需要注意的是,通过 Orchard CMS 管理仪表板安装 NuGet 包是加载我们代码的机制。此问题中之前对在线环境的所有引用均指的是尝试加载此代码的过程。
当我实际将包作为项目添加到我们的解决方案中时,不会出现问题,并且我们的 web-api 实现在我们的测试环境中运行。
但是,这不是解决方案,因为我们不会也不会在生产环境中维护解决方案源的版本。但是,它可能会为知识渊博的人提供一些关于正在发生的事情的线索?
【问题讨论】:
-
开发和生产编译器/链接器设置之间是否存在构建配置差异?我遇到了与 .NETCore 类似的问题,结果证明运行时针对的是 STA 而不是 Core。
-
@iHazCode 不要看起来像个傻瓜,但你能详细说明这些是哪些确切设置/在哪里修改它们?我知道我在两台机器上都没有 .NETCore(就您提到的特定场景而言),但毫无疑问可能有其他属性可能会影响这一点。
-
查看 Build -> Configuration Manager 以确保没有明显差异。然后,在生产配置中,转到解决方案资源管理器中的问题参考并确保设置了复制到输出目录选项。另一种可能性是为此配置标记了“请勿复制”。
-
这两个项目的配置绝对相同。
-
我已经更新了原始问题。将我们的代码作为项目加载到解决方案中会导致 API 按预期工作。但是,这不是解决方案,因为我们的 prod 环境不会托管源代码。它可能会为知识渊博的人提供错误的潜在原因?
标签: c# asp.net-web-api jwt orchardcms