【问题标题】:How to get the claims out of a authenticated SecurityToken如何从经过身份验证的 SecurityToken 中获取声明
【发布时间】:2016-08-26 20:14:00
【问题描述】:

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

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

【问题讨论】:

    标签: c# jwt identityserver3


    【解决方案1】:

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

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

    一种解决方案:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-04-22
        • 2021-08-12
        • 1970-01-01
        • 2019-06-17
        • 2016-04-29
        • 2012-07-03
        • 2021-04-07
        • 1970-01-01
        • 2019-09-13
        相关资源
        最近更新 更多