为什么我的代码认为某个值是 Microsoft.IdentityModel.Json.Linq.JObject,而实际上它应该是 Newtonsoft.Json.Linq.JObject?

Dav*_*Dev 9 c# identityserver4

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

JwtRequestAuthorizeTests.authorize_should_accept_complex_objects_in_request_object()

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

根据记录,someObj它只是一个 json 对象,定义为:

{{
    "foo": {
        "bar": "bar"
    },
    "baz": "baz"
}}
Run Code Online (Sandbox Code Playgroud)

另请注意,当我从 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,因为它应该是:

在此输入图像描述

chy*_*600 8

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

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

我的猜测是微软已经改变了定义并且不希望人们在其命名空间之外使用该类型。

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

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