重定向到我的网站的用户从第三方网站抛出一个重定向的 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# 点网中实现上述解决方案?