代码之家  ›  专栏  ›  技术社区  ›  GregH

C#使用自定义头创建JWT并使用私钥签名

  •  0
  • GregH  · 技术社区  · 4 年前

    我试图弄清楚如何在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);
    

        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添加自定义头?

    2 回复  |  直到 4 年前
        1
  •  1
  •   Ryan Wilson    4 年前

    看起来您可以向该方法传递额外的头 Jose.JWT.Encode 作为可选参数:类型为的参数 IDictionary<string, object> 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
  •  0
  •   Volodymyr Puzdriak    4 年前

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

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

    在这种情况下,例如,当您在授权标头中提供令牌时,该数据将移动到服务器。因此,不建议将大数据保留在那里。

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