我试图在c#中不对称地验证json网络令牌的概念验证。我目前正在尝试使用Json Web Token Handler for Microsoft.NET库,但我正努力让它运行起来。文档是有限的,大多数在线帖子都是对称发行令牌或验证令牌。我能够使用通用JWT库对称验证令牌,如this post中所述,但根据解码函数的编写方式,提供的解决方案不处理非对称验证。
以下是我正在使用的代码:
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!");
}
我遇到了一些错误,即在tokenValidationParameters部分和Validate令牌方法中。我不确定这些功能在我的场景中是如何工作的。我需要设置哪些验证参数?另外,我在msdn page上看到有一个带有令牌和验证参数的重载方法,但我收到一个编译错误,表明此方法的任何版本都不需要2个参数。
最后,是否有人知道此代码是否真的可用于非对称验证,或者JWTHandler上的ValidateToken方法是否仅适用于对称验证?
任何帮助都将不胜感激。感谢。
答案 0 :(得分:1)
我找到了问题的解决方案,只是想分享。我最终使用了用于对称验证的JWT库。我偶然发现this issue并发现它们分支了库并包含了非对称验证的代码。可以找到实施代码here。
我用来导入.pfx证书并验证令牌的代码:
var certificate = new X509Certificate2(certpath, "password", X509KeyStorageFlags.Exportable);
var privateKey = certificate.Export(X509ContentType.Pfx);
string payload = JWT.Decode(tokenString, privateKey);