c# - 为什么我的代码认为一个值是 Microsoft.IdentityModel.Json.Linq.JObject 而实际上应该是 Newtonsoft.Json.Linq.JObject?

标签 c# identityserver4

我在失败的单元测试中遇到了很多困难。具体来说,
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

enter image description here

那么 StackOverflow 能否告诉我为什么会发生这种情况,也许我该如何解决?

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

enter image description here

最佳答案

从 .Netframework WebAPI 迁移到 dotnetcore3.1 后,我遇到了完全相同的问题。我不敢相信我搜索了整个互联网,只能找到这个问题作为唯一的相关结果。
显然 JWT 负载类型不再是 NewtonSoft.Json.Linq.JObject 。它现在是 Microsoft.IdentityModel.Json.Linq.JObject 并且在其命名空间之外无法访问。
我的猜测是 Microsoft 已经更改了定义,并没有想到人们会在其命名空间之外使用该类型。
我最终做的是摆脱类型检查,直接在 try{} catch{} 块中解析。
parse-payload-directly
希望这会在将来对其他人有所帮助。

关于c# - 为什么我的代码认为一个值是 Microsoft.IdentityModel.Json.Linq.JObject 而实际上应该是 Newtonsoft.Json.Linq.JObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62398659/

相关文章:

c# - 扩展 IdentityServer4 服务

c# - 使用返回随机结果的函数进行单元测试

asp.net-core - 带有存储在 cookie 中的刷新 token 的 SPA - 如何使用 IdentityServer4 进行配置?

c# - IdentityServer4在asp.net core中注册UserService并从数据库中获取用户

c# - lambda 的 Linq 更新问题

asp.net-core - Kestrel 失败 : Can not load Microsoft. Extensions.Logging.Abstractions

javascript - IdentityServer Authentication AspCore 和 Angular Client 最佳实践

c# - 将 json 返回到核心 2 中的部分 View

c# - 卡巴斯基将我的 ConsoleApplication 检测为木马

c# - c#中小数计算错误