如何限制从Internet访问Web资源但在Intranet中公开

时间:2019-06-11 06:06:08

标签: c# asp.net angular rest asp.net-web-api

我有一个用ASP.NET WebForms编写的网站,该网站可以访问用ASP.NET WebAPI编写的Web服务。为了安全起见,我关闭了端口8079(Web服务),以便只能通过网站访问Web服务,但无法直接从Internet请求Web服务。当我通过Fiddler程序在网站上请求页面时,看到了对网站的请求,但是没有看到网站对Web服务的请求。一切正常。但是现在我做了另一个用AngularJS编写的网站,我希望这个网站也可以访问我的封闭式Web服务。通过AngularJS可以做到吗?下面是通过ASP.NET网站进行的Web服务请求代码。

HttpResponseMessage response = 
client.GetAsync("http://localhost:8079/api/values/5").Result;
if (response.IsSuccessStatusCode)
{
    Task<string> data = response.Content.ReadAsStringAsync();
    result += data.Result;
}

因此,站点( AngularJS )和ASP.Net MVC Web应用程序应该在Internet上可用,而Web服务( ASP.NET WebAPI )应该可用在Internet上不可用。

3 个答案:

答案 0 :(得分:0)

“当我通过Fiddler程序在网站上请求页面时,看到了对网站的请求,但是没有看到网站对Web服务的请求”

在非常有限的情况下,该说法是正确的,但实际情况远非如此。

例如,使用浏览器工具可以很容易地看到网站对自己API的请求...在任何浏览器中按F12键,然后在“网络”标签下查看,这是任何人都可以执行的操作,以查看网站(网站)在做。

您需要以某种方式保护您的API。您可以使用OAuth2之类的方法,也可以在服务器级别使用。例如,您可以锁定服务器以仅接受来自您网站IP地址的连接。您还可以使其完全锁定API所在的服务器。您可以锁定API。

您只需要意识到如果您不执行任何操作,便会遇到安全问题。您使用的技术堆栈与此无关。

答案 1 :(得分:0)

  

当前,客户端直接访问Web服务,但是必须使客户端访问Web服务器,并且使Web服务器访问Web服务

即使您创建另一个ASP.NET应用程序(一种“ facade”)来处理来自客户端的请求并在内部调用Web服务,仅此也无法解决问题:

  • 如果外观接受来自任何客户端的请求并将其仅发送到Web服务,则与将Web服务直接公开到Internet并无不同。

正如@Andrei Dragotoniu指出的那样,您必须仅接受来自授权客户端的请求来保护您的服务。

如何授权访问Web服务

保护访问Web服务的一种常用方法是JSON Web Token (JWT)。令牌包含加密的声明,这些声明解释了客户端的身份(可能还有其他方面)。通常它的工作方式如下:

    成功验证客户端后,会在服务器上
  • 生成一个新令牌。身份验证可以是手动的(登录表单),也可以是自动的(例如,使用OAuth)。
  • 生成令牌后,它将返回给客户端。然后,客户端开始将令牌作为HTTP标头附加到它发送到Web服务的每个请求。在每次请求时,Web服务都会验证所附加的令牌。

This blogpost提供了更多信息以及在C#中使用JWT的示例。

API网关

限制对内部网络访问Web服务的要求并不罕见。这里的典型解决方案是API Gateway

  

(from Wikipedia) 网关:充当API前端的服务器,接收API请求,执行限制和安全策略,将请求传递给后端服务,然后将回复给请求者。网关通常包括一个转换引擎,用于即时编排和修改请求和响应。网关还可以提供功能,例如收集分析数据和提供缓存。网关可以提供支持身份验证,授权,安全性,审计和法规遵从性的功能。

有关API网关in this article的更多信息。 Kong是最受欢迎的API网关之一。

答案 2 :(得分:0)

即使在Intranet中部署Web服务,也无法从客户端浏览器( Angular或JS应用程序)使用Web服务。

一种可能的解决方案是,

  1. 在Intranet Web服务器中部署Web服务。
  2. 在边缘服务器中创建代理Web服务(它们都面向Intranet和Internet )。代理Web服务应仅通过遮盖原始Web方法来公开所需的方法。
  3. 从客户端应用程序使用代理Web服务。

否则,客户端应用程序将永远无法使用Intranet Web服务。

(可选)如果创建基于ASP.Net的NodeJS Web应用程序,则可以将其部署在可以与Intranet Web服务进行通信的边缘Web服务器上,并且用户(生活在互联网上)无法访问Web直接提供服务。

更新: 此外,根据上述代码,您似乎正在尝试从.Net运行时托管代码( ASP.Net MVC )中使用Web服务。好吧,在这种情况下,AngularJS将与您的控制器动作相对应。然后,边缘服务器中的控制器可以与任何Intranet Web服务进行通信。 AngularJS无需与Web服务对话。现在很简单。