如何通过http客户端强制调用restful服务?

Posted

技术标签:

【中文标题】如何通过http客户端强制调用restful服务?【英文标题】:How to force to make a call to a restful service through http client? 【发布时间】:2015-08-04 15:43:30 【问题描述】:

注意事项:

首先,我正在寻找程序化/自动化解决方案,而不是个人解决方案。恐怕这个问题没有直接的答案,因为技术,所以我会检查任何解决方法来进行验证。

场景:

我有我的客户(第三方应用程序)可以使用的公共 RESTful 服务。

它具有基本身份验证(在标头中),并且 POST 具有一个参数,其中包含 SHA-256 中的加密字符串以及在其他参数中发送的数据,以验证数据。 这个加密字符串是由我为每个客户提供的哈希键创建的,因为有些客户是他们之间的竞争对手。 总之……

问题:

一些客户直接从 ajax 访问服务,而不是使用服务器端 http 客户端。他们在 javascript 中使用 hashkey 和 user/pass 并注意我的建议,他们的代码没有变化。因此,我们不会在生产环境中启用它们。

问题:

有可能(我该怎么做?)验证调用是否来自服务器端而不检查 URL 引用?

就像评论一样,我在 C# 中使用 Web Api 2.2,但我认为我可以自己编写代码,所以任何没有代码的答案无论如何都会有用。

恐怕没有任何答案,因为客户都是一样的,但是任何一些解决方法或想法都会受到重视。

对不起,我的英语和 HTTP 客户端知识很差。

【问题讨论】:

如何检查没有Referer 标头或User-Agent 标头不包含任何已知的浏览器名称? 一点是您可以通过检查DelegatingHandler 上的Request.IsAjaxRequest 来检查请求是否为ajax 请求,从而保护您的web api 免受ajax 攻击,但这可以部分解决您的问题。是的,更喜欢@Aurélien 的上述评论以添加更多限制。 感谢两位。他们是真正的好方法! 【参考方案1】:

如果您能描述为什么客户使用 ajax 是一个问题 - 将更容易猜测通用解决方案。例如,您可以创建注册服务,您的客户必须指定他们的 IP,以便您可以将它们列入白名单,或者您可以创建所有客户都应该使用的客户端身份验证库。

【讨论】:

感谢您的想法。我不能拒绝这些 IP,因为它们是动态的,而且图书馆违反了“服务休息”原则。

以上是关于如何通过http客户端强制调用restful服务?的主要内容,如果未能解决你的问题,请参考以下文章

使用 WCF 客户端访问 RESTful 服务时访问 HTTP 状态代码

如何通过 Preflight Request 从 javascript 调用 REST Webservice?

如何在Java Jersey REST服务中强制使用queryparams?

服务之间的调用方式

Spring提供的用于访问Rest服务的客户端:RestTemplate实践

如何从 RESTful 服务发送安全令牌?