' JWT'名称空间System.IdentityModel.Tokens中不存在 - 仅在生产中

时间:2018-02-12 03:00:50

标签: c# asp.net-web-api jwt orchardcms

我正在尝试在我的基于Orchard CMS的网站上启动web-api模块。为了安全起见,web-api必须使用JWT。

我制作了这样一个模块。在我的开发环境中离线构建和编译时,一切都很成功。我能够查询API并获得一些结果。以下是API在我的开发环境Postman Response Screenshot

中返回JWT的证明

这很好,很花哨。但是,当我尝试将模块上传到我现有的网站(在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上看到了关于使用5.0.0.0+ JWT的汇编版本的其他问题,例如here - 但是没有一个问题出现同样的错误。另外,我已经确认我的代码正在使用构建中的正确对象,例如。 SigningCredentials和SymmetricSecurityKey,所以我不相信这些答案与我的具体情况有关。

我对使用参考装配解决这些问题并不太熟悉,所以如果这是一个简单的解决方案,我道歉。这是我尝试过的:

  1. 设置System.IdentityModel.Tokens.Jwt&#34;特定版本&#34;在构建nuget包之前,我的项目中的true属性。同样的错误仍然存​​在。
  2. 修改Web.Config以在bindingRedirect程序集的旧版本上使用System.IdentityModel.Tokens.Jwt。同样的错误仍然存​​在(该二进制文件的旧版本正在解决方案中的另一个项目中使用)。
  3. 删除using System.IdentityModel.Tokens.Jwt;语句,并强烈定义依赖此using语句的任何对象。有趣的是,在这样做的过程中,我没有收到例如声明中的错误。 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler(); - 但我在HttpActionResult实现中的must declare a body because it is not marked abstract or extern.行收到错误public string ReasonPhrase { get; }
  4. 上面的第3点让我相信ASP.Net版本可能存在一些问题导致所有这些奇怪(因为上面只是一个简单的属性......),但我真的不确定。我确保目标框架在我的开发和在线环境(.NET Framework 4.5.2)上都是相同的。

    对我来说,这一切都没有意义,因为在我的开发环境中一切都运行得很好,开发环境建立在与我的在线环境相同的OrchardCMS版本上。

    我在项目中使用的参考组件:

    • System.IdentityModel.Tokens.Jwt - v5.1.5.0
    • Microsoft.IdentityModel.Tokens - v5.1.5.0

    对此事的任何帮助都非常感激 - 这个小问题阻碍了我的进步,我似乎没有做任何事情来解决这个问题!!

    其他信息: 我应该澄清一下我们的生产&#34;此问题中提到的环境不维护我们的源代码版本。然而,我创建了一个独立的测试环境,它反映了我们的生产环境,并在那里安装了源代码。

    请务必注意,通过Orchard CMS管理仪表板安装NuGet包是加载代码的机制。此问题中所有先前对在线环境的引用都是指尝试加载此代码的过程。

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

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

1 个答案:

答案 0 :(得分:0)

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