如何从经过身份验证的SecurityToken

时间:2016-08-26 20:14:00

标签: c# jwt identityserver3

我将一个标记作为字符串传递给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

就曝光属性而言,没有其他任何东西对我有用了,但由于我可以在调试器中看到声明,我确信有一种方法我只是没有看到。

2 个答案:

答案 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来验证和检索声明集合。

async