使用C#使用公钥验证JWT

5
我正在构建一个由C#编写的Azure函数支持的React应用程序。我已经通过Userfront实现了JWT身份验证,前端工作正常,但我无法使用函数中的公钥验证令牌。
我尝试了多种方法,其中最近的是JWT-DotNet,但都没有成功。
请问有人可以提供一个可行的代码示例吗?
这是我目前的代码(在创建新的RS256Algorithm时出错,错误为“找不到请求的对象”):
var headers = req.Headers;
if (!headers.TryGetValue("Authorization", out var tokenHeader))
   return new StatusCodeResult(StatusCodes.Status403Forbidden);

var token = tokenHeader[0].Replace("Bearer ", "");

var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(Environment.GetEnvironmentVariable("Userfront_PublicKey"));

var urlEncoder = new JwtBase64UrlEncoder();
var publicKey = urlEncoder.Encode(plainTextBytes);

try
{
   IJsonSerializer serializer = new JsonNetSerializer();
   var provider = new UtcDateTimeProvider();
   IJwtValidator validator = new JwtValidator(serializer, provider);
   IJwtAlgorithm algorithm = new RS256Algorithm(new X509Certificate2(plainTextBytes));
   IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder,algorithm);

   var json = decoder.Decode(token[0], publicKey, verify: true);
}
catch (TokenExpiredException)
   ...
catch (SignatureVerificationException)
   ...

1
你确定先从授权头中删除“Bearer”文本了吗? :) - Daniel Lorenz
好的,谢谢指出!我没有注意到这个问题,如果不解决,可能会在后面给我带来麻烦。但是现在还是出现了同样的错误 :( - DiscoStu1975
谢谢@BrettCaswell。目前的设置是直接从React应用程序调用Azure函数,因此理想情况下,我希望继续使用这种方式。根据Userfront文档,使用JWT DotNet是可能的,但他们并没有提供示例。 - DiscoStu1975
我会复制并粘贴你试图解码的确切文本,并将其放入https://jwt.io/中,看它是否可以解析。 - Daniel Lorenz
嗨。看起来你无法仅使用公钥创建适用于RS256算法的证书。 - Real Ambush
显示剩余3条评论
1个回答

1
假设环境变量"Userfront_PublicKey"包含一个PEM编码的RSA公钥,即:
-----BEGIN RSA PUBLIC KEY-----
(your base64-encoded RSA public key)
-----END RSA PUBLIC KEY-----

那么我会尝试以下方法(未经测试,抱歉):

var headers = req.Headers;
if (!headers.TryGetValue("Authorization", out var tokenHeader))
    return new StatusCodeResult(StatusCodes.Status403Forbidden);

var token = tokenHeader[0].Replace("Bearer ", "");

var publicKeyPem = Environment.GetEnvironmentVariable("Userfront_PublicKey");
var publicKey = RSA.Create();
publicKey.ImportFromPem(publicKeyPem);

try
{
    var json = JwtBuilder.Create()
                         .WithAlgorithm(new RS256Algorithm(publicKey))
                         .MustVerifySignature()
                         .Decode(token); 
}
catch (TokenExpiredException)
...
catch (SignatureVerificationException)
...

谢谢您的回复。我相信它可能有效,但需要 .net core 5 并且需要转换一些函数,这是目前有点繁琐的任务。 - DiscoStu1975
导入 ??? 未找到 RS256Algorithm - Andrew Matiuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接