簡體   English   中英

從 JWT 獲取自定義聲明的值

[英]Getting values of custom Claims from JWT

我有一個 controller 接收 JWT 令牌,我需要從中獲取自定義聲明。 該聲明屬於http://www.imsglobal.org/spec/lti/v1p3/#custom-properties-and-variable-substitution定義的“自定義”類型(不幸的是,它們與規范的鏈接是 404)。

這在解碼令牌中的樣子是

在此處輸入圖像描述

這樣做

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);

data是:

在此處輸入圖像描述

希望看到一個 object 例如

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

目標是能夠通過data.name獲取這些值。 訪問這些的正確方法是什么?

您可以在 object 中獲取數據,如下所示:

var claim = token.Claims.First(c => c.Type == "https://purl.imsglobal.org/spec/lti/claim/custom");
var data = (JObject)JsonConvert.DeserializeObject(claim.Value);//convert to JObject
var name = data["name"].ToString();  //get the property value...

//expected object
var model = new
{
    name = data["name"].ToString(),
    email = data["email"].ToString(),
    userId = data["userid"].ToString()
};

目標是能夠通過 data.name 獲取這些值。

如果你想做這個工作,你需要創建一個視圖 Model:

Model:

public class UserModel
{
    public string name { get; set; }
    public string email { get; set; }
    public int userid { get; set; }
}

Controller:

var data = JsonConvert.DeserializeObject<UserModel>(claim.Value);
var name = data.name;

由於您使用的是 Newtonsoft,因此您可以將 JSON object 反序列化為匿名類型,這將允許您訪問您提到的值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);

這將為您提供類似於您最初期望的 object。 當然,這要求您能夠定義匿名類型的屬性名稱和類型。 如果聲明的格式已知,那么應該沒問題,但您必須考慮它是否適合您的用例。

如果您不想 go 使用匿名類型,您可以簡單地將 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM