如何从经过身份validation的SecurityToken中获取声明

我将一个标记作为字符串传递给SOAP服务,并validation该标记是有效的。 我现在有一个SecurityToken,在调试模式下我可以看到所有声明,特别是userId声明我想要传递给另一个方法。 我似乎无法弄清楚如何获得索赔。 现在我解码了令牌的字符串版本(令牌的无validation字符串版本,我至少等到成功validation后。)这是代码块:

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 

对于暴露的属性,我没有其他任何东西看起来很有希望,但是因为我可以在调试器中看到声明,我确信有一种方法我只是没有看到。

您可能会看到声明,因为调试器使用的是对象的实际类型,而不是基本的SecurityToken类。 将其作为真实类型投射,您应该可以更轻松地访问声明。

那,或使用securityTokenHAndler来validation和检索索赔集合。

https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securitytokenhandler.validatetoken(v=vs.110).aspx

我刚刚经历了同样的事情,即在调试时,在LoadToken上可以看到Payload属性,但在编辑代码时似乎没有Payload属性。

看起来SecurityToken的基础类型是JwtSecurityToken(尽管QuickCatch的securityCode.GetType()返回的是SecurityToken,而不是JwtSecurityToken。)。 无论如何,转换为实际的底层类型并引用Payload集合为我做了诀窍。

一解决方案:

 string userId = ((JwtSecurityToken)access_token).Payload["userId"].ToString();