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

use*_*446 6 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);
}
Run Code Online (Sandbox Code Playgroud)

如何从 SecurityToken 中获取声明?

validatedToken.Id; // not it
validatedToken.ToClaimsPrincipal(cert); // doesn't work
Run Code Online (Sandbox Code Playgroud)

就公开的属性而言,对我来说似乎没有其他希望,但由于我可以在调试器中看到声明,我确信有一种我没有看到的方法。

Eri*_*lan 11

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

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

一种解决方案:

string userId = ((JwtSecurityToken)access_token).Payload["userId"].ToString();
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 1

您看到这些声明可能是因为调试器使用的是对象的真实类型,而不是 SecurityToken 基类。将其转换为真实类型,您应该可以更轻松地访问声明。

或者使用 securityTokenHAndler 来验证并检索声明集合。

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