【问题标题】:Invalid JWT Signature无效的 JWT 签名
【发布时间】:2020-01-21 16:57:44
【问题描述】:

我知道。我知道。很多问题都有这个确切的标题。但在我看过的所有文件中,我找不到一个使用List<Claim>issueraudience 创建 JWT。

    private string GetTokenString()
    {
        var claims = new List<Claim>()
        {
            new Claim("claim1", "foo-anything"),
            new Claim("claim2", "bar-anything")
        };

        string keyValue = "1234567890qwertyuiopasdfghjklzxcvbnm";  // NOT THE REAL KEY (changed for this SO question)
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(keyValue));

        var jwtToken = new JwtSecurityToken
          (
              issuer: "https://xxxxxx.net",
              audience: "https://www.xxxxxx.com",
              claims: claims,
              signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature),
              expires: DateTime.Now.AddMinutes(30)
          );

        var handler = new JwtSecurityTokenHandler();
        string tokenString = handler.WriteToken(jwtToken);

        return tokenString;
    }

然后,如果我将tokenString 插入https://jwt.io/,我得到

签名无效

我创建 JWT 的方式有问题吗?

【问题讨论】:

  • 有效载荷中声称的签名验证无关紧要。但是您选中了“秘密 base64 编码”复选框,而在您的代码中,您无处可解码。好像错了。

标签: c# .net jwt


【解决方案1】:

查看签名密钥的 base64 编码

1234567890qwertyuiopasdfghjklzxcvbnm

原来是这样的

MTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5t

请使用此值来验证生成的令牌,在这种情况下应选中复选框。

如果您将复选框留空,则使用与代码中相同的值。

【讨论】:

  • 如果未选中该框,它将使用原始字符串进行验证。我不明白你在说什么。
  • 在未选中复选框或使用字段中的 base64 编码值选中时,我仍然得到“无效签名”。
  • 一切似乎仍然在这个令牌的接收端工作。这一切都验证得很好。我需要担心这个吗?
  • @casey Crookston ,我已经更新了答案,希望很清楚。只是回复您上次的询问,是的,应该没问题。只需确保在生产中,与验证客户端安全地交换共享密钥即可。
猜你喜欢
  • 2016-12-29
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2018-06-14
  • 2019-08-04
  • 2019-05-05
  • 2018-10-04
相关资源
最近更新 更多