Forge Webhooks回调负载签名验证失败,寻求技术解决方案
Forge Webhook签名验证不一致的排查与解决
我之前对接Forge Webhooks时也碰到过一模一样的坑!明明密钥和Forge后台注册的完全一致,本地用C#、在线HMAC工具、官方Node.js示例计算的哈希都能对上,但就是和Forge返回的签名不匹配,合法请求被拦下来真的让人头大。结合我的踩坑经验,给你几个核心排查方向:
最可能的问题:请求体被重复读取导致内容不全
ASP.NET(Core)里的request.Body是只能读取一次的流,如果你的项目里有日志中间件、模型绑定逻辑提前读取过请求体,那你这里request.Body.ReadAsBytes()拿到的就不是完整的原始请求内容——基于错误内容计算的哈希,自然和Forge的签名对不上。
解决方法是先把请求体缓存到内存流,确保拿到完整的原始数据:
private const string SHA_HASH = "sha1hash"; // 先缓存请求体,避免流被读取后无法获取原始内容 using var memoryStream = new MemoryStream(); await request.Body.CopyToAsync(memoryStream); memoryStream.Position = 0; // 重置流位置到开头 var bodyBytes = memoryStream.ToArray(); // 计算哈希 var secretKeyBytes = Encoding.UTF8.GetBytes(ForgeAuthConfiguration.AntiForgeryToken); using var hmac = new HMACSHA1(secretKeyBytes); var computedHash = hmac.ComputeHash(bodyBytes); // 用BitConverter转换十六进制字符串,比Aggregate更简洁不易出错 var computedSignature = $"{SHA_HASH}={BitConverter.ToString(computedHash).Replace("-", "").ToLowerInvariant()}";
其他需要排查的细节
- 密钥准确性:再仔细核对一遍密钥——有没有多余的空格、换行符?Forge的密钥是大小写敏感的,复制时别漏了首尾字符。
- 哈希算法匹配:确认Forge Webhook配置里的签名算法是SHA1(对应代码里的
HMACSHA1)。如果不小心选了SHA256,要把代码改成HMACSHA256,同时前缀改成sha256hash。 - 请求体编码:Forge默认用UTF-8编码发送请求体,但可以再确认下——如果编码不匹配,转成字节数组时会直接导致哈希错误。
验证小技巧
用抓包工具(比如Fiddler、Charles)获取Forge发送的原始请求体,把它和你的密钥一起放到在线HMAC生成器计算:
- 如果结果和Forge的签名一致,说明问题肯定出在代码读取请求体的环节;
- 如果还是不一致,就要重新检查密钥或者算法配置了。
内容的提问来源于stack exchange,提问作者Marian Simonca
相关产品推荐
相关产品推荐

