C# 如何限制从internet访问web资源,但在intranet中公开

C# 如何限制从internet访问web资源,但在intranet中公开,c#,asp.net,angular,rest,asp.net-web-api,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服务。这可以通过Angula

我有一个用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;
}
HttpResponseMessage响应=
client.GetAsync(“http://localhost:8079/api/values/5三、结果;
if(响应。IsSuccessStatusCode)
{
任务数据=response.Content.ReadAsStringAsync();
结果+=数据。结果;
}
因此,网站(AngularJS)和ASP.Net MVC Web应用程序应该在Internet上可用,而Web服务(ASP.Net WebAPI)不应该在Internet上可用。

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

这一说法在非常有限的背景下是正确的,但现实远不止如此

从一个网站到它自己的API的请求可以通过使用浏览器工具很容易地看到,例如。。。在任何浏览器中点击F12并查看“网络”选项卡下的内容,这是任何人都可以执行的操作,以查看网站(任何网站)正在执行的操作

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

你只需要意识到,如果你不采取行动,你确实会遇到安全问题。您使用的技术堆栈与此无关

目前,客户机直接访问web服务,但需要让客户机访问web服务器,web服务器访问web服务

即使您创建了另一个ASP.NET应用程序(一种“门面”)来处理来自客户端的请求,并在内部调用web服务,但仅此一点并不能解决问题:

  • 如果facade接受来自任何客户机的请求并将它们发送到web服务,那么它与将web服务直接公开到internet没有什么不同
正如@Andrei Dragotoniu所指出的,您必须通过只接受授权客户的请求来保护您的服务

如何授权访问web服务 保护对web服务的访问的一种常见方法是。令牌包含解释客户端身份(可能还有其他方面)的加密声明。通常,其工作原理如下:

  • 成功验证客户端后,将在服务器上生成新令牌。身份验证可以是手动的(登录表单),也可以是自动的(例如,使用)
  • 生成令牌后,它将返回给客户端。然后,客户机开始将令牌作为HTTP头附加到它发送到web服务的每个请求上。在每个请求上,web服务都会验证附加的令牌
提供了在C#中使用JWT的更多信息和示例

API网关 限制内部网络访问web服务的要求并不少见。这里的典型解决方案是

网关:充当API前端的服务器,接收API请求,实施限制和安全策略,将请求传递给后端服务,然后将响应传递回请求者。网关通常包括一个转换引擎,用于动态协调和修改请求和响应。网关还可以提供收集分析数据和提供缓存等功能。网关可以提供支持身份验证、授权、安全、审核和法规遵从性的功能


更多关于API网关的信息。最流行的API网关之一是

即使在intranet中部署web服务,也不能从客户端浏览器(Angular或JS应用程序)使用web服务

一个可能的解决办法是

  • 在intranet web服务器中部署web服务
  • 在边缘服务器中创建代理web服务(它们都面向intranet和internet)。代理web服务应该通过隐藏原始web方法来公开所需的方法
  • 从客户端应用程序使用代理web服务
  • 否则,客户端应用程序永远无法使用intranet web服务

    或者,如果创建基于ASP.Net的NodeJ web应用程序,则可以将其部署在边缘web服务器上,这些服务器可以与intranet web服务进行通信,并且用户(生活在internet中)无法直接访问web服务

    更新:
    此外,根据上面的代码,您似乎正在尝试使用.Net运行时托管代码(ASP.Net MVC)中的web服务。那么,在这种情况下,AngularJS将ajax添加到您的控制器操作中。然后,边缘服务器中的控制器可以与任何intranet web服务进行通信。AngularJS不需要与Web服务对话。现在就直截了当了。

    您可能必须将您的web服务公开到internet,并使用某种形式的身份验证来保护它(例如JWT)。请记住,您的AngularJS网站,所有代码都是在客户端浏览器上执行的,而不是在服务器上执行的。所以它需要公开…我们不想保护我们的web服务,我们想阻止从Internet访问web服务。我们需要这样做,以便web服务器可以通过