我们正在开发一个使用 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
并进行一些反射来获取属性和值,并将它们粘贴在字典中来工作。这很有效,特别是考虑到我们缺乏首选的解决方案......
首选解决方案
现在,我们需要一个模型 ( 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 请求推送到 a中?Dictionary<string,string>()