.NET 库中的 JWT 无效签名

Posted

技术标签:

【中文标题】.NET 库中的 JWT 无效签名【英文标题】:JWT Invalid Signatures in .NET libraries 【发布时间】:2021-08-04 06:27:07 【问题描述】:

我目前正在努力使用任何 .net 库创建签名以访问 Twitch api 端点。当我将生成的 jwt 复制粘贴到那里时,jwt.io 页面总是说签名无效。当我编辑秘密时,签名显然已调整,当我使用调整后的 jwt 时,我可以毫无问题地进行 Twitch api 调用。当我使用我生成的 jwt 时,我总是以 401 身份验证失败告终。

我现在尝试了几乎所有的 .net 库,但它们都为 HS256 生成了错误的签名……我不确定我做错了什么,因为我是 JWT 的新手,找不到任何指向我的东西正确的方向。这是我使用 jwt.net 库 (https://github.com/jwt-dotnet/jwt) 生成 jwt 的代码。如果有人可以帮助我,将不胜感激。

        var payload = new Dictionary<string, object>
        
            "exp", DateTimeOffset.Now.AddSeconds(360).ToUnixTimeSeconds(),
            "user_id", "668312333",
            "role", "external",
        ;
        var secret = Encoding.UTF8.GetString(Convert.FromBase64String("MY SHARED EXTENSION SECRET FROM TWITCH"));

        IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); // symmetric
        IJsonSerializer serializer = new JsonNetSerializer();
        IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
        IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
        
        var token = encoder.Encode(payload, secret);

【问题讨论】:

跳出来的一件事,是你通过UTF8把你的秘密变成一个字符串,试试var secret = Convert.FromBase64..... @KeithNicholas OMG 我实际上是哑巴哈哈,或者是盲人。就是这样xD非常感谢!如果您想将此作为答案发布,我很乐意将其标记为解决方案!谢谢! 很容易犯错误,在这种情况下字符串应该可以工作,但我认为字符串的编码和解码不匹配。它只是字节数组实际上是秘密的所需形式 【参考方案1】:

您需要将秘密设置为字节数组,因为这是底层库所需要的:-

var secret = Convert.FromBase64String("MY SHARED EXTENSION SECRET FROM TWITCH");

【讨论】:

以上是关于.NET 库中的 JWT 无效签名的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中的自定义 JWT 一直说签名无效

Django Rest Framework 中的 JWT 身份验证错误“无效签名”

使用 JWT 在 c# 中生成令牌的无效签名

使用 jsonwebtoken 库生成的 JWT 令牌在 jwt.io 中提供了无效签名

JWT nodejs / express - 无效签名

在 jwt.io 中总是得到无效的签名