c# - 使用 C# 的公钥验证 JWT

标签 c# .net azure jwt

我正在构建一个由用 C# 编写的 Azure 函数支持的 React 应用程序。我已经通过 Userfront 实现了 JWT 身份验证,该身份验证在前端运行良好,但我很难使用函数中的公钥来验证 token 。

我尝试了多种方法,JWT-DotNet是最新的,但无济于事。

有人可以提供一个有效的代码示例吗?

这是我目前所拥有的(在创建新的 RS256 算法时出现错误“无法找到请求的对象。”):

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)
   ...

最佳答案

假设环境变量“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)
...

关于c# - 使用 C# 的公钥验证 JWT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67811903/

相关文章:

c# - 在 UWP 中导航回来后 AdControl 停止更新

c# - 使用 Entity Framework 替换选择的字符串

c# - 了解编译器优化

.net - none 和 null CipherAlgorithmType 之间有什么区别?

visual-studio - 无法使用 Visual Studio 访问 Azure SQL 数据库,但可以使用 SSMS

Azure数据工厂: Copy Data activity always returning error from REST or HTTP source datasets

C# Visual Studio 截断 INSERT 查询中的字符串参数

c# - c#调用窗体后如何返回调用方法?

c# - 为什么 Interlocked.CompareExchange<T> 只支持引用类型?

azure - 基于http header 自定义逻辑的动态路由(Azure、AWS、GCP)