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

C# Sendgrid Webhook请求验证的payload参数定义及验证失败问题咨询

SendGrid Webhook 签名验证失败排查方案

核心问题原因

你当前验证失败最常见的原因是payload参数使用了自行序列化后的字符串,而非SendGrid推送的原始HTTP请求体内容:

  • 你将接收到的object[]再次序列化得到的JSON,会因为键顺序、空格缩进、转义字符处理、换行符差异和SendGrid实际推送的原始请求体不一致,直接导致签名校验失败。
  • 正确的payload应该是从HttpRequest中直接读取的未做任何修改的原始请求体RAW字符串。

拼接逻辑说明

你提到的拼接逻辑是正确的:将从请求头读取的X-Twilio-Email-Event-Webhook-Timestamp值直接拼接在原始请求体字符串的最前面,中间不需要插入任何分隔符(空格、换行等都不能加)。

其他可能的异常点排查

  • 公钥处理检查:确认你的ConvertPublicKeyToECDSA方法正确解析SendGrid提供的PEM格式公钥,使用的签名曲线为P-256(prime256v1),没有出现公钥解析错误。
  • 请求头读取检查:确认你读取的请求头名称正确,签名头为X-Twilio-Email-Event-Webhook-Signature,时间戳头为X-Twilio-Email-Event-Webhook-Timestamp。
  • 编码一致性检查:读取原始请求体时使用UTF-8编码,签名校验时的timestampedPayload编码要和SendGrid签名时使用的UTF-8编码完全一致。

正确的原始请求体读取示例(C#)

// 在调用IsValidRequest前读取原始请求体,注意要开启请求体允许重复读取
request.EnableBuffering();
using var reader = new StreamReader(request.Body, Encoding.UTF8, leaveOpen: true);
string rawPayload = await reader.ReadToEndAsync();
request.Body.Position = 0;
// 将rawPayload作为payload参数传入你的校验方法即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:36:01