在 C# 中非对称地验证 JWT

本文关键字:验证 JWT 非对称 | 更新日期: 2023-09-27 18:36:43

我正在尝试进行概念验证,在 c# 中以非对称方式验证 json Web 令牌。我目前正在尝试 Microsoft.NET 库的 Json Web 令牌处理程序,但我正在努力让它工作。文档有限,大多数在线帖子要么发行代币,要么对称验证代币。如本文所述,我能够使用通用 JWT 库对称验证令牌,但那里提供的解决方案不处理基于解码函数编写方式的非对称验证。

这是我正在使用的代码:

var jwtHandler = new JwtSecurityTokenHandler();
var certificate = new X509Certificate2(certpath, "password", X509KeyStorageFlags.Exportable);
var privateKey = certificate.PrivateKey as RSACryptoServiceProvider;
if (privateKey == null)
{
   throw new Exception("Not an RSA private key");
}
var cspBlob = privateKey.ExportCspBlob(true);
var pk = Convert.ToBase64String(cspBlob);
//This code also works instead of the above code, I believe
//var privateKey = certificate.Export(X509ContentType.Pfx);
var tokenValidationParameters = new TokenValidationParameters()
{
   ValidAudience = "exampleAudience",
   ValidIssuer = "exampleIssuer",                    
   IssuerSigningToken = pk
};
//The token passed in here is a string version of the token
//I have tried both a JWTSecurityToken token and just a string version
ClaimsPrincipal claimsPrincipal = jwtHandler.ValidateToken(asymmetricToken, tokenValidationParameters);
if (claimsPrincipal != null)
{
    // Valid
    Console.Write("Valid!");
}

我收到一些错误,即在令牌验证参数部分和验证令牌方法中。我只是不确定这些函数在我的场景中如何工作。我需要设置哪些验证参数?此外,我在 msdn 页面上看到有一个重载的方法采用令牌和验证参数,但我收到一个编译错误,指示此方法的任何版本都没有采用 2 个参数。

最后,有谁知道这段代码是否真的适用于非对称验证,或者 JWTHandler 上的 ValidateToken 方法仅适用于对称验证?

任何帮助将不胜感激。谢谢。

在 C# 中非对称地验证 JWT

我找到了我问题的解决方案,只是想分享。我最终使用了用于对称验证的 JWT 库。我偶然发现了这个问题,发现他们分支了库并包含用于非对称验证的代码。可以在此处找到实现的代码。

我用于导入 .pfx 证书并验证令牌的代码:

var certificate = new X509Certificate2(certpath, "password", X509KeyStorageFlags.Exportable);
var privateKey = certificate.Export(X509ContentType.Pfx);
string payload = JWT.Decode(tokenString, privateKey);