.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
相关产品推荐
相关产品推荐

