C# 使用jose JWT和JWT.io生成的JWT令牌

C# 使用jose JWT和JWT.io生成的JWT令牌,c#,jwt,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

我正在尝试在.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;

}
我在尝试使用站点测试生成的令牌时遇到问题。实际上,我复制/粘贴生成的令牌,输入myawesomekey作为密钥,但它一直告诉我签名无效


我可以忽略这一点,因为我的C代码中的解码是有效的,但我很好奇,我想知道为什么通过该站点进行解码会失败。我唯一的想法是,在C代码中,我必须以字节数组的形式传递密钥,因此仅将myawesomekey传递到站点可能是无效的。

您获取的密钥字节不正确:

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;

很好。这可能也是System.IdentityModel.Tokens.Jwt出现问题的原因。

好的,多亏了您的回答,我可以让这两个实现都正常工作。谢谢然而,我有一个小问题。哪个图书馆最好?在我看来,jose jwt更直截了当,但另一个是微软制造的,很多例子都是用它制作的,所以。。。我只是想知道,如果我选择jose jwt,这是否是一个问题?@ssougnez我从未使用过或听说过jose jwt。查看-它显示jose jwt在验证令牌后有几个漏洞向下滚动一点。System.IdentityModel.Tokens.Jwt有三个易受攻击的算法,但是当使用HS256时,您会很好。好的,非常感谢。顺便说一句,我在System.IdentityModel.Tokens.Jwt上遇到的问题来自两个不同的方面:您指出的获取字节密钥的方式,以及iat声称我是在日期时间而不是整数上定义的。因此在解码过程中失败了。谢谢