我尝试通过使用存储在 Azure 密钥保管库中的私钥进行签名来创建 JWT 令牌。我的代码运行良好并且生成了令牌,但该令牌无法与我尝试登录的 API 一起使用。通过 Python 生成令牌效果很好。我使用 jwt.io 来解码有效负载数据,并比较了通过 C# 和 Python 生成的令牌。我注意到,Python 生成的令牌中的 Issued At 声明(“iat”)没有被双引号包围,但在另一个令牌中却有引号。
有没有办法创建一个以 integer 作为声明值的 System.Security.Claim?我尝试将“Integer64”作为 ValueType 参数包含在内,但它不起作用。在下面的代码中,我只是删除了“iat”声明值周围的引号,它就可以工作了。这是我应该做的吗?
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.Now.ToUnixTimeSeconds().ToString(), "Integer64")
};
var payload = JsonSerializer.Serialize(new JwtPayload(claims));
payload = payload.Replace("iat\":\"", "iat\":").Replace("\"}", "}");
var headerAndPayload = $"{Base64UrlEncoder.Encode(header)}.{Base64UrlEncoder.Encode(payload)}";
这是 API 所期望的(没有双引号):
jwt.io 解码的有效负载
在 C# 中,我尝试删除“iat”声明值周围的双引号,并且它起作用了。在 Python 中使用 jwt.encode 时,这不是必需的。
更好的方法是使用 .NET 库中的构建来生成 JWT 令牌,以确保一切正确。
.NET 中有两个不同的库用于生成令牌,您可以在此处阅读: 为什么我们有两个 JWT 令牌类 JwtSecurityTokenHandler 和 JsonWebTokenHandler?
这里有一个用于手动创建令牌的资源: https://www.c-sharpcorner.com/article/jwt-validation-and-authorization-in-net-5-0/
使用ClaimValueTypes.Integer32作为第三个参数