C# 使用自定义 Headers 创建 JWT 并使用私钥签名
C# Create JWT with Custom Headers and Sign with Private Key
我想弄清楚如何在 C# 中创建具有自定义 headers 并使用私钥签名的 JWT。我目前的尝试如下并且似乎有效,除了我还没有找到在其中包含自定义 headers 的方法。
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);
}
}
如何将自定义 headers 添加到使用私钥签名的 JWT?
您可以通过添加声明来添加自定义数据。它们将被添加到令牌中。
claims.Add(new Claim("MyCustomClaimName", "MyCustomClaimValue"));
在这种情况下,当您在授权 header 中提供令牌时,此数据将移动到服务器。所以不建议把大数据放在那里
如果您只需要在客户端获得令牌时 return 一些数据 - 只需向响应模型添加额外的属性。
看起来您可以将额外的 headers 作为可选参数传递给方法 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);
我想弄清楚如何在 C# 中创建具有自定义 headers 并使用私钥签名的 JWT。我目前的尝试如下并且似乎有效,除了我还没有找到在其中包含自定义 headers 的方法。
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);
}
}
如何将自定义 headers 添加到使用私钥签名的 JWT?
您可以通过添加声明来添加自定义数据。它们将被添加到令牌中。
claims.Add(new Claim("MyCustomClaimName", "MyCustomClaimValue"));
在这种情况下,当您在授权 header 中提供令牌时,此数据将移动到服务器。所以不建议把大数据放在那里
如果您只需要在客户端获得令牌时 return 一些数据 - 只需向响应模型添加额外的属性。
看起来您可以将额外的 headers 作为可选参数传递给方法 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);