【问题标题】:How to extract and get a claim from token?如何从令牌中提取和获取声明?
【发布时间】:2017-10-05 22:59:59
【问题描述】:

我一直在寻找一个确切的答案,但似乎大多数答案都是客户来电,超出了范围。

问题:我已经有一个访问令牌访问令牌。如何使用仅给定访问​​令牌的 c# 代码获取声明?

我认为:以下是相同的问题,但没有我认为合适的答案。

How to get the claims out of a authenticated SecurityToken

How do I read claims from my Oauth token?

【问题讨论】:

  • 澄清一下:您想在服务器上仅根据用户的不记名令牌来识别用户的声明吗?
  • 是的,这可能吗?
  • 是的。我试图在jwt.io 中解码我的令牌,其中包括。
  • 我在您发布答案之前编辑了我的最后一条评论 - 请查看该评论中的链接,这可能会对您有所帮助。

标签: c# token access-token claims-based-identity claims


【解决方案1】:

安装包Newtonsoft.Json

访问令牌只是 base64 编码的 JSON。您可以按如下方式解析令牌

        string token =
            "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ";
        var parts = token.Split('.');
        var decoded = Convert.FromBase64String(parts[1]);
        var part = Encoding.UTF8.GetString(decoded);
        var jwt = JObject.Parse(part);
        var name = jwt["name"].Value<string>();

更新

  1. 不建议在客户端解析访问令牌,访问令牌 应该只在资源服务器上解析。
  2. 您必须在资源服务器上验证访问令牌才能使 确保令牌在途中没有被篡改。
  3. 大多数时候你不需要像上面那样解析令牌,只需使用 推荐的同时进行验证和解析的 JWT 库。例如

    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

【讨论】:

    【解决方案2】:

    rawel 提供了一个非常方便的示例!我遇到的一个小问题是我必须使用的命名空间(只是为了让下一个人更容易找到它,因为我还不能发布 cmets):

    using System.Text;
    using Newtonsoft.Json.Linq
    

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review