在C#

时间:2016-02-29 21:22:25

标签: c# .net jwt

我试图在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方法是否仅适用于对称验证?

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

1 个答案:

答案 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);