[英]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.