gpt4 book ai didi

c# - 从 JWT 获取自定义声明的值

转载 作者:行者123 更新时间:2023-12-04 01:09:56 27 4
gpt4 key购买 nike

我有一个接收 JWT token 的 Controller ,我需要从中获取自定义声明。声明属于 http://www.imsglobal.org/spec/lti/v1p3/#custom-properties-and-variable-substitution 定义的“自定义”类型(不幸的是,他们指向规范的链接是 404)。

这在解码后的 token 中看起来像

enter image description here

这样做

var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.ReadJwtToken(authorizedRequest.id_token);

// TODO this is way too vague and _can't_ be the correct way that we can get this information from all platforms, can it?
var claim = token.Claims.First(c => c.Type == "https://purl.imsglobal.org/spec/lti/claim/custom");
var data = JsonConvert.DeserializeObject(claim.Value);

数据是:

enter image description here

希望看到一个对象,例如

{
name = "Chris",
email = "c@ex.com",
userId = "123"
}

目标是能够使用 data.name 获取这些值。访问这些的正确方法是什么?

最佳答案

由于您使用的是 Newtonsoft,因此您可以将 JSON 对象反序列化为匿名类型,这样您就可以访问您提到的 data.Name 中的值。这是否是适合您的用例的解决方案取决于您。

var claim = token.Claims.First(c => c.Type == "https://purl.imsglobal.org/spec/lti/claim/custom");

var dataType = new { Name = "", Email = "", UserId = "" }
var data = JsonConvert.DeserializeAnonymousType(claim, dataType);

Foo.DoSomethingWithData(data.Name);

这将为您提供一个类似于您最初期望的对象。当然,这要求您能够定义匿名类型的属性名称和类型。如果声明的格式已知,那么它应该没问题,但您必须考虑它是否适合您的用例。

如果您不想使用匿名类型,您可以简单地将 JSON 反序列化为字典并相应地访问它。

var claim = token.Claims.First(c => c.Type == "https://purl.imsglobal.org/spec/lti/claim/custom");

var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(claim);

DoSomething(data["name"]);

这是指向每种方法的 Newtonsoft API 引用的链接。 https://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm https://www.newtonsoft.com/json/help/html/DeserializeDictionary.htm

关于c# - 从 JWT 获取自定义声明的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65190792/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com