首页 > 解决方案 > 如何限制从 Internet 访问 Web 资源但在 Intranet 中公开

问题描述

我有一个用 ASP.NET WebForms 编写的网站,它可以访问用 ASP.NET WebAPI 编写的 Web 服务。为了安全起见,我关闭了 8079 端口(Web 服务),这样 Web 服务只能通过网站访问,而无法直接从 Internet 请求 Web 服务。当我通过 Fiddler 程序请求网站上的页面时,我看到了对网站的请求,但没有看到来自网站的对 Web 服务的请求。一切正常。但现在我制作了另一个用 AngularJS 编写的网站,我希望这个网站也能访问我封闭的网络服务。这可以通过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 上不可用。

标签: c#asp.netangularrestasp.net-web-api

解决方案


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

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

  • 如果门面接受来自任何客户端的请求并将它们发送到 Web 服务,这与将 Web 服务直接暴露给 Internet 没有什么不同。

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

如何授权访问 Web 服务

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

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

这篇博文提供了在 C# 中使用 JWT 的更多信息和示例。

API 网关

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

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

本文中有关 API 网关的更多信息。Kong是最受欢迎的 API 网关之一。


推荐阅读