无法使用 .NET 验证 JSON Web 令牌 – 密钥太短

2023-12-10

我用过JSONWebTokennpm 模块生成 jwt:

var jwt = require('jsonwebtoken');

var payload = {
    "iss": "https://secure.example.com/",
    "exp": 1410819380,
    "http://example.com/orgnum": "987987987",
    "http://example.com/user": "[email protected]"
};

var token = jwt.sign(payload, 'secret');

console.log(token);

这给了我以下输出:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Nly3VyZS5leGFtcGxlLmNvbS8iLCJleHAiOjE0MTA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9vcmdudW0iOi I5ODc5ODc5ODciLCJodHRwOi8vZXhhbXBsZS5jb20vdXNlciI6Im1lQGV4YW1wbGUuY29tIiwiaWF0IjoxNDA4Mzk0Mjk2fQ.5X5LTg4wxDF2p49xtsRcG4S9Yk4qSfW1tMEU0AquBhc

由于我没有指定我想要什么算法,因此它使用 SHA256。

现在,我尝试在 C# 中验证这一点。结果并不容易...

我收到有关密钥大小的异常:

IDX10603:“System.IdentityModel.Tokens.InMemorySymmetricSecurityKey”不能少于:“128”位。 参数navn:key.KeySize 实际尺寸是48。

我尝试扩展密钥,在创建对称密钥时出现新错误:

Base-64 字符数组或字符串的长度无效

我认为这与我向 .net 代码告知我的密钥的方式有关。自从SymmetricKeyIssuerSecurityTokenProvider构造函数参数被命名base64Key,我尝试对我的密钥进行 Base64Url 编码:

        var secret =  Base64UrlEncoder.Encode("secret");
        TokenValidationParameters validationParameters = new TokenValidationParameters
        {                
            ValidateIssuer = false,
            ValidateAudience = false,
            IssuerSigningTokens = new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret).SecurityTokens
        };

那么,我在这里缺少什么?
为什么可以jsonwebtoken使用短密钥生成和验证记事,而 .net 不能?
为什么 .net 不能接受我给它的密钥?

下面是完整的 .net 代码,其中包含使用长密钥签名的记事本:

        var jwtToken =
            "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3NlY3VyZS5leGFtcGxlLmNvbS8iLCJleHAiOjE0MTA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9vcmdudW0iOiI5ODc5ODc5ODciLCJodHRwOi8vZXhhbXBsZS5jb20vdXNlciI6Im1lQGV4YW1wbGUuY29tIiwiaWF0IjoxNDA4Mzk1NjY4fQ.ZceiiEO_Mn5_GZp5D_r68VTT33fbocn1BTTznD6u3cs";
        var secret = Base64UrlEncoder.Encode("super duper secret with some more on top");


        TokenValidationParameters validationParameters = new TokenValidationParameters
            {
                ValidateIssuer = false,
                ValidateAudience = false,
                IssuerSigningTokens = new SymmetricKeyIssuerSecurityTokenProvider("issuer", secret).SecurityTokens
            };


        JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler()
            {
                Configuration = new SecurityTokenHandlerConfiguration()
                    {
                        CertificateValidationMode = X509CertificateValidationMode.None
                    }
            };

        SecurityToken validatedToken;
        var claimsPrincipal = tokenHandler.ValidateToken(jwtToken, validationParameters, out validatedToken);
        return claimsPrincipal.Claims;

Updated:

我在这段代码中只使用了微软的东西。我正在使用OwinMicrosoft.Owin.Security.Jwt版本2.1.0 with System.IdentityModel.Tokens.Jwt版本4.0.0-RC2.

有多个博客文章指出您需要手动更新System.IdentityModel.Tokens.Jwt包裹。


我不确定你正在使用什么 API,因为微软官方一不包含您正在使用的属性。我的猜测是,您使用的是过时的版本。

我从中获取了API努吉特包。这是对我有用的代码:

using System;
using System.Collections.Generic;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;
using System.Security.Claims;
using System.ServiceModel.Security.Tokens;
using System.Text;

namespace SO25372035
{
    class Program
    {
        static void Main()
        {
            const string tokenString =  @"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3NlY3VyZS5leGFtcGxlLmNvbS8iLCJleHAiOjE0MTA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9vcmdudW0iOiI5ODc5ODc5ODciLCJodHRwOi8vZXhhbXBsZS5jb20vdXNlciI6Im1lQGV4YW1wbGUuY29tIiwiaWF0IjoxNDA4NDE5NTQwfQ.jW9KChUTcgXMDp5CnTiXovtQZsN4X-M-V6_4rzu8Zk8";
            JwtSecurityToken tokenReceived = new JwtSecurityToken(tokenString);

            byte[] keyBytes = Encoding.UTF8.GetBytes("secret");
            if (keyBytes.Length < 64 && tokenReceived.SignatureAlgorithm == "HS256")
            {
                Array.Resize(ref keyBytes, 64);
            }
            TokenValidationParameters validationParameters = new TokenValidationParameters
            {
                ValidateIssuer = false,
                AudienceUriMode = AudienceUriMode.Never,
                SigningToken = new BinarySecretSecurityToken(keyBytes),
            };

            JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();

            ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(tokenReceived, validationParameters);
            IEnumerable<Claim> a = claimsPrincipal.Claims;
            foreach (var claim in a)
            {
                Console.WriteLine(claim);
            }
        }
    }
}

请注意,我必须调整包含密钥的数组的大小,以便密钥长度通过验证。它出现HMAC 的密钥长度始终等于块大小,对于 SHA256,它是512 bits。有MinimumSymmetricKeySizeInBits 静态属性定义了 SimmetricKey 的最小长度,但似乎不能设置为小于 128。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 .NET 验证 JSON Web 令牌 – 密钥太短 的相关文章

随机推荐

  • Spring Boot + Yaml + @PropertySource + @ConfigurationProperties + 属性源文件中的列表未注入

    我正在尝试注射external yml属性到 POJO 使用 ConfigurationProperties并导入我的external yml文件使用 PropertySource 所有其他的都被注入到 POJO 中 但不是一个复杂的列表
  • 使用 PowerShell 从 SharePoint 打开 Excel 文档

    我正在尝试使用 PowerShell 从 SharePoint 打开 Excel 工作簿 我没有加载 SharePoint 管理单元 我没有它 当 PowerShell 尝试启动工作簿时 SharePoint 会提示输入凭据 问题是我们正在
  • 公式值的 Google 脚本返回 #N/A

    当我在脚本中读取时 F 列有一个公式值 显示 N A 下面是一个非常简单的脚本代码 但我无法理解为什么它显示 N A 我没有实现任何触发器 var spreadsheet SpreadsheetApp getActiveSpreadshee
  • .filter 中的 ES6 .filter

    所以我有如下数据 id 0 title happy dayys owner id 1 username dillonraphael tags value Art label Art items id 1 title happy dayys
  • 如何从 MS Word 中的行号获取文本

    是否可以使用办公自动化从 MS Word 中的给定行号获取文本 行或句子 我的意思是 如果我可以获得给定行号中的文本或作为该行一部分的句子本身 那就可以了 我没有提供任何代码 因为我完全不知道如何使用办公自动化阅读 MS Word 我可以像
  • 将字符串数组转换为整数数组

    所以基本上用户从扫描仪输入输入序列 12 3 4 etc 它可以是任意长度 并且必须是整数 我想将字符串输入转换为整数数组 so int 0 将会12 int 1 将会3 etc 有什么建议和想法吗 我正在考虑实施if charat i 获
  • GetWindowRect 在 Windows 10 中具有偏移量

    我在程序中使用 GetWindowRect 来获取桌面上窗口的坐标 这在我用于测试的十几台电脑 XP W8 1 上运行良好 但在我的一台带触摸屏的 W10 电脑上则不然 坐标向左上角有偏移 我在 google 上搜索了 Windows 10
  • 如果数据保持不变,有没有办法让同一个 SQL 查询得到不同的结果?

    当我运行这个查询时 我间歇性地得到一个不同的结果集 有时它给出 1363 个结果 有时给出 1365 个结果 有时给出 1366 个结果 数据没有改变 可能是什么原因造成的 有什么方法可以预防吗 查询看起来像这样 SELECT FROM S
  • 使用 Java 运行 Linux/Unix 文件系统?

    我需要创建一个 Java util 它将通过 Unix 和 或 Linux 文件系统递归并构建目录结构的对象模型 检索文件信息 大小 创建日期 上次访问日期等 另外我需要检索文件所在的物理存储设备上的信息 理想情况下 该实用程序是可移植的
  • Google Chart API:更改悬停图例的颜色

    所以我有一个柱形图其中一项内置功能是 您可以将鼠标悬停在图表图例中的某个项目 所谓的类别 上 然后您会在图表中相应的列周围看到一些突出显示边框 现在 我的图表中有许多列和类别 并且很难看到突出显示的系列 类别 因为默认行为仅在列周围显示 1
  • 使用“rvalueCast”的默认 Visual Studio 项目设置

    我有了一个令人震惊讽刺 gt 的发现 默认情况下 Visual Studio 2015 不兼容 C 11 我可以按照步骤操作我在这里列出对于每个项目 或使用 Notepad 或类似工具进行文件替换 但我确实注意到 命令行 属性有一个复选框
  • 在 SQL Server 中,我可以将多个节点从表插入到 XML 中吗?

    我想根据表中的数据在存储过程中生成一些 XML 以下插入允许我添加许多节点 但它们必须是硬编码或使用变量 sql variable SET MyXml modify insert
  • 使用 JSch 作为 SFTP 客户端时如何启用被动模式?

    我正在使用 JSch 作为 SFTP 客户端 现在我需要启用被动模式由于安全方面的一些限制 但我找不到启用的方法被动模式 有人可以告诉我该怎么做吗 被动模式 是FTP协议的一个特点 在正常 FTP 模式下 对于每个单独的文件 客户端都会侦听
  • 按下空格键时,删除的复选框会重新出现在树视图节点中

    我已经使用了公认的解决方案从这个问题去除checkbox from a 树形视图节点 in my WM INITDIALOG处理程序 加载后 tree有一个适当的外观 选择节点并单击所在位置后checkbox会是 什么也没有发生 check
  • keras多层LSTM模型的股价预测收敛于恒定值

    I ve made a multilayer LSTM model that uses regression to predict next frame s values of the data The model finishes aft
  • 如何使用indexedDB的承诺在@ngrx/core中设置initialState

    我想使用 idb 包在 ngrx 中设置初始状态 该包使用 Promise 来获取数据 但每次尝试设置时都会出现错误 我读到 ngrx 是同步的 这是否意味着它不能与 Promise 一起使用 我尝试过的不同方法 这是我的 idb 包装方法
  • CPU 如何知道针对硬件中断运行哪个中断服务程序?

    例如 按下键盘上的按键 导致向CPU生成硬件中断 CPU向中断控制器发送确认 在中断处理阶段 CPU如何根据键盘上的按键判断运行哪个中断服务程序呢 None
  • 元素跟随鼠标移动和滚动

    我正在尝试编写一些 Vanilla Javascript 来使元素跟随我的鼠标移动 我使用了 clientX clientY 和 mousemove 事件来使其跟随 但是当我滚动页面时 元素不会随鼠标移动 我想也许我需要使用滚动事件 但我正
  • 将 Firebase 身份验证与 Google App Engine 结合使用

    我是新手所以任何帮助表示赞赏 我使用 Google App Engine 节点 创建了一个应用程序 服务 它返回一个简单的 hello world 响应 请参阅https resumetemplatesconverter appspot c
  • 无法使用 .NET 验证 JSON Web 令牌 – 密钥太短

    我用过JSONWebTokennpm 模块生成 jwt var jwt require jsonwebtoken var payload iss https secure example com exp 1410819380 http ex