How to generate JWT signed token using keyId using JWS header in c#

问题描述 投票:0回答:0

重定向到我的网站的用户从第三方网站抛出一个重定向的 url,我想验证重定向的 URL,第三方使用 RS256 算法使用 RSA 私钥对重定向的 url 进行签名,然后将其作为签名放在 url 中。重定向的 url 看起来像:

string redirectUrl = "https://my-domain.com/landservicecallback?state=abcd1234&dealId=xyz5678&expireOn=2006-09-18T00:00:00.000Z&signature=VGhpcyBpcyBhIHNpZ25hdHVyZSB0byB2ZXJ5IHRoaXMgaW5zdGFuY2U%3D&keyId=%3MvJikN0EgR5vNplYFZR50z2G******";

第三方为我提供了一份文档(使用 Nimbus Java lib 的文档,但我想要它在 c# 中)关于他们希望我如何通过从给定的重定向 url 参数和公钥生成签名的 JWT 令牌来验证签名。

所以我在下面做的是:

首先从重定向的 url 数据生成 JWtPayload:

        // Set up the JWT payload
        var claims = new[]
        {
            new Claim("partnerUrl", "https://www.my-domain.com"),
            new Claim("dealId", "testDealId"),
            new Claim("expireOn", "2023-02-18T00:00:00.000Z"),
        };
        var payload = new JwtPayload(claims);

之后文档要求我使用 JWSAlgorithm.RS256 和 keyId 生成 JWSHeader(附加在重定向的 url 中,注意:它不是公钥)。这实际上是我卡住的地方,我似乎找不到在我的 c#

中复制以下代码的方法
// create JWS header
JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.RS256).keyID(keyId).build();

// create JWT object
 SignedJWT signedJWT = new SignedJWT(jwsHeader, payload);

我看到一个类似的库 jose-jwtfor c# 但它通过提供公钥返回 JWT 令牌但不能像上面那样做。

注意:文档还提到,在上述步骤中获得签名的 JWT 对象后,我需要使用公钥构建 jwsVerifier 并验证 url 中给出的签名,如下所示:

// create verifier
JWSVerifier jwsVerifier = new RSASSAVerifier(rsaPublicKey);
try {
valid = jwsVerifier.verify(jwsHeader, signedJWT.getSigningInput(), new Base64URL(signature));
} catch (JOSEException e) {
   throw new RuntimeException("Failed to verify signature", e);
}

这种加密机制对我来说是全新的,所以我可能无法在 c# 中为上述代码制定解决方法。有什么建议我怎样才能在 c# 点网中实现上述解决方案?

c# .net-core jwt rsa json-web-signature
© www.soinside.com 2019 - 2024. All rights reserved.