在 .NET 中验证 Mandrill 入站 Webhook 请求

Posted

技术标签:

【中文标题】在 .NET 中验证 Mandrill 入站 Webhook 请求【英文标题】:Authenticating Mandrill Inbound Webhook Requests in .NET 【发布时间】:2015-12-31 03:59:56 【问题描述】:

我正在使用 Mandrill 入站 Webhook 调用 WCF API 中的方法。请求通过,我可以成功解析等。

我的问题在于获取 X-Mandrill-Signature 标头的值以匹配我正在生成的签名(基于此处详述的过程:https://mandrill.zendesk.com/hc/en-us/articles/205583257-Authenticating-webhook-requests)。

这是我目前正在做的事情:

List<string> keys = HttpContext.Current.Request.Params.AllKeys.ToList();
       keys.Sort();
       string url = "MyMandrillWebhookURL";
       string MandrillKey = "MyMandrillWebhookKey"
       foreach (var key in keys)
       
           url += key;
           url += HttpContext.Current.Request.Params[key];
       
       byte[] byteKey = System.Text.Encoding.ASCII.GetBytes(MandrillKey);
       byte[] byteValue = System.Text.Encoding.ASCII.GetBytes(url);
       HMACSHA1 myhmacsha1 = new HMACSHA1(byteKey);
       byte[] hashValue = myhmacsha1.ComputeHash(byteValue);
       string generatedSignature = Convert.ToBase64String(hashValue);

generatedSignature 的值与X-Mandrill-Signature 的值不匹配

我知道 Mandrill 文档表明编码需要以二进制而不是十六进制进行(我认为我的代码可以做到这一点,但如果我错了,请纠正我),但是,除此之外我无法做到我的问题是正面还是反面。非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

问题在于您如何在验证中检索密钥。您只需要按字母顺序按键使用请求的 POST 变量,而不是所有请求参数。只有一个 POST 变量 mandrill_events 需要在签名生成中使用。

string url = "MyMandrillWebhookURL";
string MandrillKey = "MyMandrillWebhookKey"
url += "mandrill_events";
url += mandrillEvents;
byte[] byteKey = System.Text.Encoding.ASCII.GetBytes(MandrillKey);
byte[] byteValue = System.Text.Encoding.ASCII.GetBytes(url);
...

【讨论】:

感谢您的回答。不过,您似乎在 url += "mandrill_events; 行上缺少了一个结束双引号。 太好了,谢谢!你知道在哪里可以测试我的实现是否有效吗? Mandrill 似乎没有任何示例计算可供验证。 mandrillEvents 来自哪里?这是整个实现的关键。

以上是关于在 .NET 中验证 Mandrill 入站 Webhook 请求的主要内容,如果未能解决你的问题,请参考以下文章

通过 Laravel / PHP 的 Mandrill 入站电子邮件

在使用 mandrill 发送电子邮件并在入站事件中接收元数据时添加自定义元数据

使用 Mandrill API 检索入站消息

将 Mandrill JSON webhook 入站电子邮件附件映射到 C# 类

ruby 中的 Mandrill 验证,在 php 和 ruby​​ 之间的翻译中丢失

如何在 .net 中处理 Mandrill WebHooks