验证 JWT 令牌 c# 的签名

verify signature of JWT Token c#

我在验证我获得的 JWT 令牌的签名时遇到了一些问题。令牌使用 HS256 签名。我尝试创建签名以证明收到的代码是:

JwtSecurityToken token = tokenHandler.ReadJwtToken(tokenString);

byte[] keyBytes = Encoding.UTF8.GetBytes("secret");

HMACSHA256 hmac = new HMACSHA256(keyBytes);
byte[] signatureBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(token.RawHeader + "." + token.RawPayload));
string signature = Convert.ToBase64String(signatureBytes);

我从收到的令牌中得到的签名例如是:

pYscLlinuNhO-sFyEIRRLZP7yrl8GopGJ3I6QSxg2tU

但是我从我的算法中得到的签名是在这种情况下:

pYscLlinuNhO+sFyEIRRLZP7yrl8GopGJ3I6QSxg2tU=

所以签名很接近,但不相等。我不明白我在验证签名时做错了什么。字母和数字似乎每次都是正确的,但特殊字符大多不同,签名末尾始终有一个“=”。 也许有人知道我做错了什么。

JWT 的三个部分是 Base64Url encoded:

A JWT is represented as a sequence of URL-safe parts separated by period ('.') characters. Each part contains a base64url-encoded value.

但是你使用了Base64编码。 Base64Url 使用“-”和“_”代替“+”和“/”,并且还省略了末尾的填充“=”。

Here is an example如何在C#中将base64转为bas64url编码