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

.NET Framework API中JwtSecurityTokenHandler.ValidateToken触发栈溢出异常

解决.NET Framework API JWT签名校验栈溢出问题

栈溢出原因

你自定义的SignatureValidator内部直接调用了JwtSecurityTokenHandler.ValidateToken,而该方法执行时会再次触发SignatureValidator的调用,形成无限递归,最终导致栈溢出。

解决方案

1. 移除自定义SignatureValidator(推荐)

默认的JWT签名验证逻辑已经覆盖了签名校验需求,不需要手动重复调用ValidateToken。只需确保密钥解析和校验参数配置正确即可:

public void Configuration(IAppBuilder app)
{
    ...
    app.UseJwtBearerAuthentication(
        new JwtBearerAuthenticationOptions
        {
            AuthenticationMode = AuthenticationMode.Active,
            TokenValidationParameters = new TokenValidationParameters()
            {
                ValidAudience = apiIdentifier,
                ValidateIssuer = true,
                ValidateIssuerSigningKey = true,
                ValidateLifetime = true,
                ValidateAudience = true,
                ValidIssuer = domain,
                RequireSignedTokens = true,
                // 确保该方法能正确返回与签发方匹配的有效签名密钥
                IssuerSigningKeyResolver = (token, securityToken, kid, parameters) => keyResolver.GetSigningKey(kid)
            }
        });
   ...
}

2. 若需自定义签名验证(避免递归)

如果确实需要自定义签名逻辑,不要调用ValidateToken,而是手动解析并验证签名:

SignatureValidator = (token, param) =>
{
    var handler = new JwtSecurityTokenHandler();
    // 手动解析JWT内容
    var jwtToken = handler.ReadJwtToken(token);
    
    // 这里实现自定义签名验证逻辑,比如:
    // 1. 通过kid获取对应密钥
    // 2. 手动验证token的签名部分
    // 注意:不要调用ValidateToken,避免递归
    
    return jwtToken;
}

原签名不校验问题说明

之前篡改/伪造Token能通过的核心原因,大概率是IssuerSigningKeyResolver未正确返回有效签名密钥,或未开启ValidateIssuerSigningKey、RequireSignedTokens校验开关。修正上述配置后,默认逻辑会自动完成签名校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:45:57