【问题标题】:Why does my code think a value is Microsoft.IdentityModel.Json.Linq.JObject when it is actually supposed to be Newtonsoft.Json.Linq.JObject?为什么我的代码认为一个值是 Microsoft.IdentityModel.Json.Linq.JObject 而实际上应该是 Newtonsoft.Json.Linq.JObject?
【发布时间】:2021-10-23 01:34:20
【问题描述】:

我在单元测试失败时遇到了很多困难。具体来说,

JwtRequestAuthorizeTests.authorize_should_accept_complex_objects_in_request_object()

测试尝试将 Object 参数添加到 Claims 数组,但失败了,因为在请求通过管道后,缺少名为“someObj”的预期参数。

为了记录,someObj 只是一个定义为的 json 对象:

{{
    "foo": {
        "bar": "bar"
    },
    "baz": "baz"
}}

另外记录一下,当我从 GitHub 中提取最新的 IdentityServer 代码时,测试通过了。

我发现它失败的原因是因为在方法JwtRequestValidator.ProcessPayloadAsync(JwtSecurityToken token) 中,变量value 的类型与预期不同。具体来说,代码认为它应该是Microsoft.IdentityModel.Json.Linq.JObject,而它应该是Newtonsoft.Json.Linq.JObject。我一生都无法弄清楚这是怎么回事或为什么会这样。

我添加这张图片是为了向您表明我没有疯(或者至少,为什么我不认为我疯了)。可以看到从valueJObject 的转换失败,如jobj = null,还可以看到value.GetType() 返回Microsoft.IdentityModel.Json.Linq.JObject

那么 StackOverflow 可以告诉我为什么会发生这种情况,也许我可以如何解决它?

另外,我认为值得注意的是我引用了 Newtonsoft.Json,因为它应该是:

【问题讨论】:

  • 我今天也遇到了这个问题,你解决了吗?
  • 不,对不起,伙计。太久远了,记不得了。

标签: c# identityserver4


【解决方案1】:

从 .Netframework WebAPI 迁移到 dotnetcore3.1 后,我遇到了完全相同的问题。我不敢相信我在整个互联网上搜索,并且只能找到这个问题作为唯一相关的结果。

显然 JWT 有效负载类型不再是 NewtonSoft.Json.Linq.JObject。它现在是 Microsoft.IdentityModel.Json.Linq.JObject,并且在其命名空间之外无法访问。

我的猜测是微软改变了定义,没想到人们会在其命名空间之外使用该类型。

我最终做的是摆脱类型检查,直接在 try{} catch{} 块中解析。

希望这将在未来对其他人有所帮助。

【讨论】:

    【解决方案2】:

    Microsoft 决定移植 JSON.NET 的副本,以便维护信任链。你可以找到它的定义:https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/1251

    【讨论】:

      【解决方案3】:

      我也遇到过类似的情况。我按照 chy600 说的做了,用 JsonConvert.DeserializeObject 修复了。

      之前:

      ((JObject)jwtPayload["field_1"])["field_2"]?.ToString()?.ToUpper() ?? ""
      

      之后:

      JsonConvert.DeserializeObject<JwtPayload>(jwtPayload["field_1"].ToString())["field_2"]?.ToString()?.ToUpper() ?? ""
      

      【讨论】:

        猜你喜欢
        • 2021-04-17
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2020-07-25
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多