【问题标题】:how to extract info out of my JWT tokens identity如何从我的 JWT 令牌身份中提取信息
【发布时间】:2016-01-14 02:48:30
【问题描述】:

我正在实现自己的 oauth 身份验证系统,并希望使用 JWT 令牌。 ms 实现有点令人困惑。我在网上看到以下哈希算法

public string Protect(AuthenticationTicket data)
    {
        if (data == null)
        {
            throw new ArgumentNullException("data");
        }

        string audienceId = ConfigurationManager.AppSettings["as:AudienceId"];

        string symmetricKeyAsBase64 = ConfigurationManager.AppSettings["as:AudienceSecret"];

        var keyByteArray = TextEncodings.Base64Url.Decode(symmetricKeyAsBase64);

        var signingKey = new HmacSigningCredentials(keyByteArray);

        var issued = data.Properties.IssuedUtc;

        var expires = data.Properties.ExpiresUtc;

        var token = new JwtSecurityToken(_issuer, audienceId, data.Identity.Claims, issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingKey);

        var handler = new JwtSecurityTokenHandler();

        var jwt = handler.WriteToken(token);

        return jwt;
    }

但似乎无法找出如何从令牌中提取用户信息

【问题讨论】:

    标签: c# asp.net-mvc jwt


    【解决方案1】:

    您所展示的是一个并非开箱即用的 JWT 保护实现。这是用于序列化和加密令牌而不是相反的。如果您已经管理了该部分(这是困难的部分),那么从 JWT 令牌中读取用户声明应该很容易。这通常由Microsoft.Owin.Security.Jwt 中间件完成

     var issuer = "http://myidentityserverurl.com"
     var audience = ConfigurationManager.AppSettings["as:AudienceId"];
     var symmetricKey = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["as:AudienceSecret"]);
    
     // Api controllers with an [Authorize] attribute will be validated with JWT
            app.UseJwtBearerAuthentication(
                new JwtBearerAuthenticationOptions {
                    AuthenticationMode = AuthenticationMode.Active,
                    AuthenticationType = "JWT",
                    AllowedAudiences = new string[] { audience } ,
                    IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
                    { 
                        new SymmetricKeyIssuerSecurityTokenProvider(issuer, symmetricKey)
                    }
                });
    

    查看此github repo 和随附的文章here,了解端到端的完整示例。

    【讨论】:

    • as:AudienceIdas:AudienceSecret 用于什么目的?
    • @Rahul AudienceId 相当于依赖方名称,或者换句话说,JWT 令牌的消费者。在上面的保护代码中,我们使用签名密钥为特定的 AudienceId 创建令牌。当您尝试使用令牌时,必须知道这 2 个。
    • 谢谢。您能否提供一个从 .c# 客户端使用 JWT 令牌的示例代码。此外,如果您可以提供示例代码以从 RestSharp 客户端使用它。在身份验证过程中,我应该将“AudienceId”和“AudienceSecret”从客户端传递给服务器吗?如何访问客户端中的声明?
    • @Rahul 我认为您需要在 SO 中提出一个新问题。 (我会使用 IdentityModel 库来帮助我做到这一点)
    • 仅供参考。我添加了一个新问题。 stackoverflow.com/questions/34968854/…
    猜你喜欢
    • 2021-10-22
    • 2017-10-12
    • 2019-01-22
    • 2019-06-17
    • 2020-06-12
    • 2022-06-13
    • 2017-02-13
    • 2021-06-06
    • 2021-11-16
    相关资源
    最近更新 更多