我有一个用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上不可用。
答案 0 :(得分:0)
“当我通过Fiddler程序在网站上请求页面时,看到了对网站的请求,但是没有看到网站对Web服务的请求” >
在非常有限的情况下,该说法是正确的,但实际情况远非如此。
例如,使用浏览器工具可以很容易地看到网站对自己API的请求...在任何浏览器中按F12键,然后在“网络”标签下查看,这是任何人都可以执行的操作,以查看网站(网站)在做。
您需要以某种方式保护您的API。您可以使用OAuth2之类的方法,也可以在服务器级别使用。例如,您可以锁定服务器以仅接受来自您网站IP地址的连接。您还可以使其完全锁定API所在的服务器。您可以锁定API。
您只需要意识到如果您不执行任何操作,便会遇到安全问题。您使用的技术堆栈与此无关。
答案 1 :(得分:0)
当前,客户端直接访问Web服务,但是必须使客户端访问Web服务器,并且使Web服务器访问Web服务
即使您创建另一个ASP.NET应用程序(一种“ facade”)来处理来自客户端的请求并在内部调用Web服务,仅此也无法解决问题:
正如@Andrei Dragotoniu指出的那样,您必须仅接受来自授权客户端的请求来保护您的服务。
保护访问Web服务的一种常用方法是JSON Web Token (JWT)。令牌包含加密的声明,这些声明解释了客户端的身份(可能还有其他方面)。通常它的工作方式如下:
This blogpost提供了更多信息以及在C#中使用JWT的示例。
限制对内部网络访问Web服务的要求并不罕见。这里的典型解决方案是API Gateway。
(from Wikipedia) 网关:充当API前端的服务器,接收API请求,执行限制和安全策略,将请求传递给后端服务,然后将回复给请求者。网关通常包括一个转换引擎,用于即时编排和修改请求和响应。网关还可以提供功能,例如收集分析数据和提供缓存。网关可以提供支持身份验证,授权,安全性,审计和法规遵从性的功能。
有关API网关in this article的更多信息。 Kong是最受欢迎的API网关之一。
答案 2 :(得分:0)
即使在Intranet中部署Web服务,也无法从客户端浏览器( Angular或JS应用程序)使用Web服务。
一种可能的解决方案是,
否则,客户端应用程序将永远无法使用Intranet Web服务。
(可选)如果创建基于ASP.Net的NodeJS Web应用程序,则可以将其部署在可以与Intranet Web服务进行通信的边缘Web服务器上,并且用户(生活在互联网上)无法访问Web直接提供服务。
更新: 此外,根据上述代码,您似乎正在尝试从.Net运行时托管代码( ASP.Net MVC )中使用Web服务。好吧,在这种情况下,AngularJS将与您的控制器动作相对应。然后,边缘服务器中的控制器可以与任何Intranet Web服务进行通信。 AngularJS无需与Web服务对话。现在很简单。