我们正致力于开发使用Plivo发送和接收SMS消息的应用程序。对于Plivo发送的每个请求,他们还会在HTTP标头中发送签名,以便我们可以验证来自Plivo的请求,而不是来自随机用户。
https://www.plivo.com/docs/xml/request/#validation
要进行此验证,我们需要POST内容作为查询字符串(例如:To=15555555555&From=11234567890&TotalRate=0&Units=1&Text=Text!&TotalAmount=0&Type=sms&MessageUUID=2be622bc-79f8-11e6-8dc0-06435fceaad7
)。
这是我们到目前为止所做的:
private bool VerifyPlivo(object thing, HttpRequestMessage Request)
{
if (Request.Headers.Contains("X-Plivo-Signature"))
{
Dictionary<string, string> reqParams = (from x in thing.GetType().GetProperties() select x).ToDictionary(x => x.Name, x => (x.GetGetMethod().Invoke(thing, null) == null ? "" : x.GetGetMethod().Invoke(thing, null).ToString()));
IEnumerable<string> headerValues = Request.Headers.GetValues("X-Plivo-Signature");
string signature = headerValues.FirstOrDefault();
return XPlivoSignature.Verify(Request.RequestUri.ToString(), reqParams, signature, plivoToken);
}
else
{
return false;
}
}
[Route("RecieveSMS")]
[HttpPost]
public HttpResponseMessage RecieveSMS(PlivoRecieveSMS req)
{
if (!VerifyPlivo(req, Request))
{
return new HttpResponseMessage(HttpStatusCode.Forbidden);
}
... // do actual work here
}
这可以通过使用它映射到PlivoRecieveSMS
的对象并进行一些反射来获取属性和值,并将它们粘贴到Dictionary中。这很有效,特别是考虑到我们缺乏首选解决方案......
现在,我们需要一个模型(PlivoRecieveSMS
)来映射数据,然后进行内省以找到键/值。我们希望将逻辑移到System.Web.Http.AuthorizeAttribute
的扩展名,以便我们可以做一些简单的事情:
[AuthorizedPlivoApi]
[Route("RecieveSMS")]
[HttpPost]
public HttpResponseMessage RecieveSMS(PlivoRecieveSMS req)
{
... // do actual work here
}
实际授权在AuthorizedPlivoApi
中完成 - 如果它无效,请求永远不会到达控制器。但我们目前无法做到这一点,因为我们无法将其映射到AuthorizedPlivoApi
内的特定对象。
我想直接访问POST键的值,或者可能将它映射到一个事先没有预先定义的动态对象。如果我能做到这一点,我们就可以实现我们的首选解决方案。
tl; dr:有没有办法在不使用特定型号的情况下将application/x-www-form-urlencoded
数据从POST请求推送到Dictionary<string,string>()
?