C# 如何限制从internet访问web资源,但在intranet中公开
我有一个用ASP.NET WebForms编写的网站,它可以访问用ASP.NET WebAPI编写的web服务。为了安全起见,我关闭了8079端口(web服务),这样只能通过网站访问web服务,但无法直接从Internet请求web服务。当我通过Fiddler程序在一个网站上请求一个页面时,我看到了一个对一个网站的请求,但我没有看到来自一个网站的对web服务的请求。一切正常。但现在我已经制作了另一个用AngularJS编写的网站,我希望这个网站也能访问我的封闭式web服务。这可以通过AngularJS实现吗?下面是通过ASP.NET网站请求web服务的代码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
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没有什么不同李>
- 成功验证客户端后,将在服务器上生成新令牌。身份验证可以是手动的(登录表单),也可以是自动的(例如,使用)李>
- 生成令牌后,它将返回给客户端。然后,客户机开始将令牌作为HTTP头附加到它发送到web服务的每个请求上。在每个请求上,web服务都会验证附加的令牌李>
更多关于API网关的信息。最流行的API网关之一是 即使在intranet中部署web服务,也不能从客户端浏览器(Angular或JS应用程序)使用web服务 一个可能的解决办法是
此外,根据上面的代码,您似乎正在尝试使用.Net运行时托管代码(ASP.Net MVC)中的web服务。那么,在这种情况下,AngularJS将ajax添加到您的控制器操作中。然后,边缘服务器中的控制器可以与任何intranet web服务进行通信。AngularJS不需要与Web服务对话。现在就直截了当了。您可能必须将您的web服务公开到internet,并使用某种形式的身份验证来保护它(例如JWT)。请记住,您的AngularJS网站,所有代码都是在客户端浏览器上执行的,而不是在服务器上执行的。所以它需要公开…我们不想保护我们的web服务,我们想阻止从Internet访问web服务。我们需要这样做,以便web服务器可以通过