1

我的应用程序具有以下架构:

jQueryMobile web 应用程序 --> 获取 JSON ---> 用 C# 创建的 REST API

我已将 REST API 代码放在 IIS 6 中的虚拟目录中。移动站点代码在网站的根目录中运行……所以大致的文件结构是这样的:

网吧/

    /index.html
    我的javascript.js

    /restapi/
      网络配置
      全球.asax
      bin/(一堆 Dlls...)

服务器位于具有以下 IP 转换(不是真实 IP...)的网络后面,例如:

Web 服务器外部 IP:121.131.141.50(带有 URL http://mysite.com/)
内部IP:10.210.2.5
子网:255.255.255.0

我尝试restapi通过 IP 限制对文件夹的访问,因为我希望它只能从 Web 服务器访问。我尝试了 IIS 方法并设置了目录安全设置,还尝试了使用ServiceAuthorizationManager类检查 Http 请求中的请求 IP 的方法。
两种方法都给了我相同的结果:通过 Fiddler 限制和测试实际服务调用没有问题,以证明除了 Web 服务器 IP:10.210.2.5 之外的任何 IP 都会抛出 401。我还能够从网络服务器执行它(这是所需的设置)。

但是,一旦移动网站 javascript 调用它,我就会得到未经授权的 401。由于 Javascript 代码是客户端,restapi 假定调用来自客户端的 IP 地址,这当然是被阻止的。

有没有一种简洁的方法来检查调用是否来自 JavaScript 所在的 IP?

还是有更好的方法来处理整个事情?!:-/ 有没有办法让 web 应用程序特别允许访问restapi虚拟目录?

4

1 回答 1

2

回到基础,您的设置如下所示:

client    <---->    web server
           HTTP

Web 服务器托管客户端可以通过 HTTP 协议从外部请求的文件。Web 服务器也是您过滤传入请求的地方:

client    <---->    | web server
           HTTP     |
                 IP filter

如果您说您希望 REST 服务只能“在同一台服务器上”访问,这意味着:

client    <---->    web server
           HTTP     ^    |
                    |    |
                    +----+
                     REST

但是,如果服务器只是与自己对话,那么您实际上并不需要一个成熟的 REST 接口。我猜您的实际意思是从服务器下载 HTML 和 Javascript 的客户端可能会通过 REST 从服务器请求其他数据。

client    <---->    web server
           HTTP

          <-------
        HTML, JS files

       -------->
           AJAX

但正如您所见,它的工作方式是客户端从服务器下载 Javascript 文件并在本地执行该 Javascript,然后将 AJAX 请求发送回服务器。请求将始终来自客户端。他们必须。发出这些请求的 Javascript 代码最初来自哪里并不重要。它可以是来自您的服务器的脚本,也可以是用户手动输入的。AJAX 请求是 HTTP 请求,与其他任何 HTTP 请求一样。无论您是否使您的 REST 服务可以从外部访问,您都无法通过生成请求的代码进行过滤。

如果您想让 API 不公开,则需要进行身份验证,以便只有注册用户才能访问它。不过,这并没有降低 API 本身的可公开访问性。

于 2012-09-24T12:59:54.113 回答