我在失败的单元测试中遇到了很多困难。具体来说,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
。我一生都无法弄清楚情况如何或为什么会这样。我包含这张图片是为了向您展示我没有疯(或者至少,为什么我不认为我疯了)。您可以看到从
value
到 JObject
的转换失败,如 jobj = null
,您还可以看到 value.GetType()
返回 Microsoft.IdentityModel.Json.Linq.JObject
。那么 StackOverflow 能否告诉我为什么会发生这种情况,也许我该如何解决?
另外,我认为值得注意的是,我引用了 Newtonsoft.Json,因为它应该是:
最佳答案
从 .Netframework WebAPI 迁移到 dotnetcore3.1 后,我遇到了完全相同的问题。我不敢相信我搜索了整个互联网,只能找到这个问题作为唯一的相关结果。
显然 JWT 负载类型不再是 NewtonSoft.Json.Linq.JObject
。它现在是 Microsoft.IdentityModel.Json.Linq.JObject
并且在其命名空间之外无法访问。
我的猜测是 Microsoft 已经更改了定义,并没有想到人们会在其命名空间之外使用该类型。
我最终做的是摆脱类型检查,直接在 try{} catch{}
块中解析。
希望这会在将来对其他人有所帮助。
关于c# - 为什么我的代码认为一个值是 Microsoft.IdentityModel.Json.Linq.JObject 而实际上应该是 Newtonsoft.Json.Linq.JObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62398659/