0

我们正在开发一个使用 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>()

4

0 回答 0