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

本文关键字:SecurityToken 获取 声明 身份验证 经过 | 更新日期: 2023-09-27 18:04:08

我将令牌作为字符串传递给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

就暴露的属性而言,对我来说似乎没有什么其他的承诺,但由于我可以在调试器中看到声明,我确信有一种方法我只是没有看到。

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

我刚刚经历了同样的事情,即在调试时,SecurityToken上可见有效载荷属性,但在编辑代码时似乎没有有效载荷属性。

看起来SecurityToken的底层类型是JwtSecurityToken(尽管securityCode.GetType()的QuickWatch返回SecurityToken,而不是JwtSecurityToken)。无论如何,转换为实际的底层类型并引用Payload集合对我来说是有效的。

一个解决办法:

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

您看到声明可能是因为调试器正在使用对象的实际类型,而不是基本的SecurityToken类。将其转换为实际类型,您应该更容易访问声明。

,或者使用securityTokenHAndler来验证并检索索赔集合。

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