在 C# 中不对称地验证 JWT

Posted

技术标签:

【中文标题】在 C# 中不对称地验证 JWT【英文标题】:Validating JWT Asymmetrically in C# 【发布时间】:2016-06-13 02:28:03 【问题描述】:

我正在尝试在 c# 中验证非对称 json Web 令牌的概念证明。我目前正在尝试 Microsoft.NET 库的 Json Web 令牌处理程序,但我正在努力让它工作。文档有限,大多数在线帖子要么发布令牌,要么对称验证令牌。我能够对称地使用this post 中描述的通用 JWT 库验证令牌,但根据解码函数的编写方式,那里提供的解决方案不处理非对称验证。 p>

这是我正在使用的代码:

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 token 方法中。我只是不确定这些功能在我的场景中是如何工作的。我需要设置哪些验证参数?此外,我在msdn page 上看到有一个采用令牌和验证参数的重载方法,但我收到一个编译错误,表明此方法的任何版本都没有采用 2 个参数。

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

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

【问题讨论】:

【参考方案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);

【讨论】:

在非对称场景中,JWTs 签名​​不是使用公钥验证的吗?我有点困惑,为什么代码示例将 privateKey 传递给 Decode 方法? 我也有同样的问题。生成 JWT 的身份验证服务器拥有私钥。并且这个 JWT 将用于调用另一个应用服务器,可以将公钥放置到应用服务器并验证这个 JWT 吗? 这个答案不再有效。链接和代码无效。

以上是关于在 C# 中不对称地验证 JWT的主要内容,如果未能解决你的问题,请参考以下文章

如何在 dotnet core 中验证非对称签名的 JWT?

JWT 密钥 - 非对称和对称

与对称密钥相比,用对称密钥签名JWT会更有用吗?

带有护照 jwt 的非对称密钥。验证总是返回 Unauthorized

前后端分离的Web应用程序中使用Spring Security+Mybatis+JWT非对称加密+动态权限管理:身份验证过滤器

jsonwebtoken介绍和使用对称加密颁发验证token