使用 jose-jwt 和 jwt.io 生成的 JWT 令牌

sso*_*nez 3 c# jwt

我正在尝试在 .NET 中生成 JWT 令牌。起初,我尝试使用“System.IdentityModel.Tokens.Jwt”,但在验证令牌期间出现问题,因此我切换到“jose-jwt”。即使我可以使用这段代码创建和验证令牌:

private byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

public string Login(LoginInformation credential)
{
    var payload = new Dictionary<string, object>()
    {
        { "sub", "mr.x@contoso.com" },
        { "exp", 1300819380 }
    };

    var secretKey = GetBytes("myawesomekey");

    string token = JWT.Encode(payload, secretKey, JwsAlgorithm.HS256);

    string json = JWT.Decode(token, secretKey);

    return json;

}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用站点“ https://jwt.io/ ”测试生成的令牌时遇到问题。事实上,我复制/粘贴生成的令牌,我输入“myawesomekey”作为密钥,但它一直告诉我“无效签名”。

我可以忽略它(因为我的 C# 代码中的解码有效),但我很好奇,我想知道为什么通过站点解码失败。我唯一的想法是,在 C# 代码中,我必须将密钥作为字节数组传递,因此可能仅将“myawesomekey”传递给站点是无效的。

Rob*_*Rob 5

您错误地获取了密钥的字节:

var payload = new Dictionary<string, object>()
{
    { "sub", "mr.x@contoso.com" },
    { "exp", 1300819380 }
};

var secretKey = Encoding.UTF8.GetBytes("myawesomekey");

string token = JWT.Encode(payload, secretKey, JwsAlgorithm.HS256);
return token;
Run Code Online (Sandbox Code Playgroud)

工作正常。这可能也是导致您使用System.IdentityModel.Tokens.Jwt.