在 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 的非对称密钥。验证总是返回 Unauthorized
前后端分离的Web应用程序中使用Spring Security+Mybatis+JWT非对称加密+动态权限管理:身份验证过滤器