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

时间:2015-10-02 20:52:19

标签: c# .net wcf mandrill webhooks

我使用Mandrill Inbound Webhooks来调用我的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);

generatedSignatureX-Mandrill-Signature

的值不匹配

我知道Mandrill文档表明编码需要以二进制而不是十六进制(我认为我的代码会这样做,但如果我错了,请纠正我),但除此之外,我可以&# 39;做出我的问题的正面或反面。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

问题在于如何在验证中检索密钥。您只需要按键按字母顺序使用请求的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);
...