我将 token 作为字符串传递给SOAP服务,并已验证该 token 有效。我现在有一个SecurityToken,在 Debug模式下,我可以看到所有声明,尤其是要传递给另一种方法的userId声明。我似乎无法弄清楚如何提出要求。现在,我解码了 token 的字符串版本( token 的未经验证的字符串版本,我至少等到成功验证之后。)这是该代码块:

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中获得 claim ?
validatedToken.Id; // not it
validatedToken.ToClaimsPrincipal(cert); // doesn't work

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

最佳答案

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

看起来SecurityToken的基础类型是JwtSecurityToken(尽管SecurityCode.GetType()的QuickWatch返回了SecurityToken,而不是JwtSecurityToken。)。无论如何,强制转换为实际的基础类型并引用Payload集合对我来说是成功的窍门。

一种解决方案:

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

09-12 03:49