【问题标题】:C# Create JWT with Custom Headers and Sign with Private KeyC# 使用自定义标头创建 JWT 并使用私钥签名
【发布时间】:2022-01-07 06:33:31
【问题描述】:

我正在尝试弄清楚如何在 C# 中创建具有自定义标头并使用私钥签名的 JWT。我目前的尝试如下,似乎有效,只是我还没有找到一种方法来在其中包含自定义标题。

            string publicKey = File.ReadAllText(@"C:\Users\blah\Desktop\Keys\testpublickey.pem");
            string privateKey = File.ReadAllText(@"C:\Users\blah\Desktop\Keys\testprivatekey.pem");
            var random = new Random();
            int num = random.Next(1000000, 500000000);
            var exp = DateTime.Now.AddMinutes(10).Ticks;

            var claims = new List<Claim>();
            claims.Add(new Claim("iss", "919d1ebb-bf3d-4c03-8855-b72b376db9ad"));
            claims.Add(new Claim("sub", "919d1ebb-bf3d-4c03-8855-b72b376db9ad"));
            claims.Add(new Claim("aud", @"https://api.alt.www.blah.com/auth/oauth/v2/token"));
            claims.Add(new Claim("exp", exp.ToString()));
            claims.Add(new Claim("jti", num.ToString()));
            
            var token = CreateToken(claims, privateKey);

和 CreateToken:

    private static string CreateToken(List<Claim> claims, string privateRsaKey)
    {
        RSAParameters rsaParams;
        using (var tr = new StringReader(privateRsaKey))
        {
            var pemReader = new PemReader(tr);

            var privateRsaParams = pemReader.ReadObject() as Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters;
            rsaParams = DotNetUtilities.ToRSAParameters(privateRsaParams);
        }
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
        {
            rsa.ImportParameters(rsaParams);
            Dictionary<string, object> payload = claims.ToDictionary(k => k.Type, v => (object)v.Value);
            return Jose.JWT.Encode(payload, rsa, Jose.JwsAlgorithm.RS256);
        }
    }

如何将自定义标头添加到使用私钥签名的 JWT?

【问题讨论】:

    标签: c# asp.net-mvc jwt


    【解决方案1】:

    看起来您可以将额外的标头作为可选参数传递给方法Jose.JWT.EncodeIDictionary&lt;string, object&gt; 类型的参数命名为:extraHeaders

    var extraHeaders = new Dictionary<string, object> 
    { 
        ////Your custom headers 
    };
     string result = Jose.JWT.Encode(
        payload, rsa, Jose.JwsAlgorithm.RS256, extraHeaders: extraHeaders);
    

    参考:jose-jwt/JWT.cs

    【讨论】:

      【解决方案2】:

      您可以通过添加声明来添加自定义数据。它们将被添加到令牌中。

      claims.Add(new Claim("MyCustomClaimName", "MyCustomClaimValue"));
      

      在这种情况下,例如,当您在 Authorization 标头中提供令牌时,此数据将移动到服务器。所以不建议把大数据放在那里。

      如果您只需要在客户端获取令牌时返回一些数据 - 只需在响应模型中添加额外的属性即可。

      【讨论】:

      • 我特别需要通过 JWT 本身的标头添加数据。即:如果您访问 jwt.io,您会看到 JWT 的标题部分。我需要在此部分添加自定义标头,这是第三方 API 强加的要求,我们无法更改
      • 在这种情况下,您可以将它们作为第四个参数添加到 Jose.JWT.Encode
      猜你喜欢
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      • 2019-10-02
      • 2013-01-06
      • 2018-05-22
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多