【发布时间】:2021-03-24 10:43:38
【问题描述】:
我正在创建 JWT 并使用存储在服务器上的私有证书存储中的 X509Certificate 对其进行签名(而不是加密)。
var signingCredentials = new SigningCredentials(new X509SecurityKey(nameOfX509Certificate2),
SecurityAlgorithms.RsaSha256Signature);
var tokenDescriptor = new SecurityTokenDescriptor()
{
Subject = new ClaimsIdentity(new[] {
new Claim("Admin", "YES", ClaimValueTypes.String)
}),
Audience = "ValidAudience",
Issuer = "ValidIssuer",
Expires = DateTime.Now.AddMinutes(5),
SigningCredentials = signingCredentials
};
JwtSecurityToken stoken = null;
var tokenHandler = new JwtSecurityTokenHandler();
stoken = tokenHandler.CreateJwtSecurityToken(tokenDescriptor);
var jwt = tokenHandler.WriteToken(stoken);
这是在服务器端完成的,并且令牌仅与其他服务器上的应用程序共享服务器端等。因此没有进行客户端签名。 我的问题是,此时证书中的公钥是否用于签名?这是我的假设,因为我们使用的是非对称 RSASHA256 算法?
下面是验证令牌的代码,同样是服务器端,使用最初用于签名的相同证书。 所以我的假设是接收应用程序使用私钥来验证令牌....正确吗?
jwt = "eyJxxxxxxxxxxxxxx...."
var signingKey = MyCertificateHelper.SigningKey(nameOfX509Certificate2); // Returns X509SecurityKey
var decryptKey = MyCertificateHelper.DecryptKey(nameOfX509Certificate2); // Returns X509SecurityKey
//Set up the parameters to validate the token
var tokenValidationParameters = new TokenValidationParameters
{
ValidAudiences = new[] { "ValidAudience" },
ValidIssuers = new[] { "ValidIssuer" },
IssuerSigningKey = signingKey,
TokenDecryptionKey = decryptKey
};
// SecurityToken validatedToken;
var handler = new JwtSecurityTokenHandler();
principal = handler.ValidateToken(jwt, tokenValidationParameters, validatedToken: out var validatedToken);
不,这很好用,我只是想清除证书中用于签名和验证的密钥,因为我看到了冲突的语句。
非常感谢
【问题讨论】:
标签: jwt signing bearer-token x509certificate2