我将一个标记作为字符串传递给SOAP服务,并验证该标记是否有效。我现在有一个SecurityToken,在调试模式下,我可以看到所有的声明,特别是userId声称我想传递给另一个方法。我似乎无法弄清楚如何获得索赔。现在我解码了令牌的字符串版本(令牌的无验证字符串版本,我至少等到验证成功后。)这是代码块:
SecurityToken validatedToken = null;
if (VerifyToken(sPassword, ref response, ref validatedToken))
{
var claimsObj = JObject.Parse(Encoding.UTF8.GetString(Base64Url.Decode(claims)));
JToken userId = claimsObj.GetValue("userId");
return implClass.Process(userId);
}
如何从SecurityToken中获取声明?
validatedToken.Id; // not it
validatedToken.ToClaimsPrincipal(cert); // doesn't work
就曝光属性而言,没有其他任何东西对我有用了,但由于我可以在调试器中看到声明,我确信有一种方法我只是没有看到。
答案 0 :(得分:1)
我刚刚经历了同样的事情,即在调试时,Payload属性在SecurityToken上可见,但在编辑代码时似乎没有Payload属性。
看起来SecurityToken的基础类型是JwtSecurityToken(尽管QuickCatch of securityCode.GetType()返回SecurityToken,而不是JwtSecurityToken。)。无论如何,转换为实际的底层类型并引用Payload集合为我做了诀窍。
一个解决方案:
string userId = ((JwtSecurityToken)access_token).Payload["userId"].ToString();
答案 1 :(得分:0)
可能您看到了声明,因为调试器使用的是对象的实际类型,而不是基本的SecurityToken类。将其作为真实类型投射,您应该可以更轻松地访问声明。
那,或者使用securityTokenHAndler来验证和检索声明集合。