C# 使用 Bouncycastle 验证使用 ES256 签名的 JWT C#

5 c# elliptic-curve jwt

我正在尝试使用 C# 中的 Bouncycastle 签署/验证 Json Web 令牌。我已经成功使用 RSXXX 和 HSXXX,但无法成功验证使用 ES256 签名的签名。我一直在使用https://kjur.github.io/jsrsasign/tool_jwt.html作为我的量尺,并使用这个简单的函数来验证生成的 JWT。

public static bool IsTokenValid(
    string jwtBase, 
    string jwtSignature, 
    string publicKey, 
    string algorithmName)
{
    ISigner signer = SignerUtilities.GetSigner(algorithmName);

    byte[] publicKeyBytes = Convert.FromBase64String(publicKey);
    AsymmetricKeyParameter publicKeyParameters = 
        PublicKeyFactory.CreateKey(publicKeyBytes);

    byte[] signatureBaseBytes = Encoding.UTF8.GetBytes(jwtBase);
    signer.Init(false, publicKeyParameters);
    signer.BlockUpdate(signatureBaseBytes, 0, signatureBaseBytes.Length);

    byte[] signatureBytes = Convert.FromBase64String(
        ToProperBase64String(jwtSignature));
    return signer.VerifySignature(signatureBytes);
}

public static string ToProperBase64String(string instance)
{
    instance = instance.Replace('-', '+').Replace('_', '/').Replace("\r", "");
    while (instance.Length % 4 != 0)
    {
        instance = instance + "=";
    }
    return instance;
}
Run Code Online (Sandbox Code Playgroud)

以下是使用默认私钥签名的 jwt 示例。

string signatureBase =
"eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2p3dC1pZHAuZXhhbXBsZS5jb20iLCJzdWIiOiJtYWlsdG86bWlrZUBleGFtcGxlLmNvbSIsIm5iZiI6MTQ3OTUzMjM0MSwiZXhwIjoxNDc5NTM1OTQxLCJpYXQiOjE0Nzk1MzIzNDEsImp0aSI6ImlkMTIzNDU2IiwidHlwIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9yZWdpc3RlciIsImF1ZCI6WyJodHRwOi8vZm9vMS5jb20iLCJodHRwOi8vZm9vMi5jb20iXX0";
string signature = "aGHSDpqHqGuG89OJCapCVBYvkpStCra8ZD4py02wGf7dPiC6mEdquE2YEGuYcjMKlNOR_0lwzpuNx0xoSmr81A";
string publicKey = @"-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoBUyo8CQAFPeYPvv78ylh5MwFZjT
CLQeb042TjiMJxG+9DLFmRSMlBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ==
-----END PUBLIC KEY-----
".Replace("-----BEGIN PUBLIC KEY-----", "")
.Replace("\n", "")
.Replace("-----END PUBLIC KEY-----", "");

bool isValid = IsTokenValid(signatureBase, signature, publicKey, "SHA-256withECDSA");
//above evaluates to false
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么吗?或者,我会对另一个可以签名和验证 ES256 JWT 的 .NET PCL 实现感到满意