【问题标题】:JWT token generated with jose-jwt and jwt.io使用 jose-jwt 和 jwt.io 生成的 JWT 令牌
【发布时间】:2017-10-02 01:23:52
【问题描述】:

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

}

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

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

【问题讨论】:

    标签: c# jwt


    【解决方案1】:

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

    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。查看jwt.io - 它表明 jose-jwt 有几个漏洞(验证令牌后向下滚动一点)。 System.IdentityModel.Tokens.Jwt 有三种易受攻击的算法,但是当使用 HS256 时,你会没事的。
    • 好的,非常感谢。顺便说一句,我在 System.IdentityModel.Tokens.Jwt 遇到的问题来自两个不同的事情:获取字节密钥的方式(正如您所指出的)以及我在 DateTime 而不是定义的“iat”声明诠释。所以它在解码过程中失败了。谢谢
    猜你喜欢
    • 2018-08-29
    • 2021-07-29
    • 2018-02-01
    • 2023-01-27
    • 2019-04-10
    • 2017-04-06
    • 2020-09-28
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多