【发布时间】:2022-11-30 12:46:32
【问题描述】:
我只想从 Apple Pay 服务器通知中验证 JWT。 您可以在 jwt.io 网站的屏幕截图上看到 JWT 结构。
因此,我从标头中的 x5c 集合中获取了第一个证书,并将其转换为对象 X509Certificate2,然后我获得了 ECDsa 格式的公钥并尝试验证令牌。
我是否在安全方面正确实施了这一点? 我应该在验证令牌后验证三个证书链吗?
我将不胜感激任何信息。
private static Dictionary<string, string> GetClaimsByToken(string jwtToken)
{
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.ReadJwtToken(jwtToken);
token.Header.TryGetValue("x5c", out object x5c)
var certeficatesItems = JsonConvert.DeserializeObject<IEnumerable<string>>(x5c.ToString());
ValidateJWS(tokenHandler, jwtToken, certeficatesItems.First());
return token.Claims.ToDictionary(c => c.Type, v => v.Value);
}
private static void ValidateJWS(JwtSecurityTokenHandler tokenHandler, string jwtToken, string publicKey)
{
var certificateBytes = Base64UrlEncoder.DecodeBytes(publicKey);
var certificate = new X509Certificate2(certificateBytes);
var eCDsa = certificate.GetECDsaPublicKey();
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false,
ValidateLifetime = false,
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new ECDsaSecurityKey(eCDsa),
};
tokenHandler.ValidateToken(jwtToken, tokenValidationParameters, out var securityToken);
}
【问题讨论】: