【问题标题】:How to restrict access to web resources from internet but expose in intranet如何限制从 Internet 访问 Web 资源但在 Intranet 中公开
【发布时间】:2019-10-25 12:08:51
【问题描述】:

我有一个用 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 上使用。

【问题讨论】:

  • 您可能必须将您的 Web 服务暴露给互联网,并使用某种形式的身份验证来保护它(例如 JWT)
  • 请记住,您的 AngularJS 网站,所有代码都在客户端浏览器上执行,而不是您的服务器。所以需要暴露...

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


【解决方案1】:

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

这种说法在非常有限的背景下是正确的,但实际情况远不止于此。

可以通过使用浏览器工具轻松查看从网站到其自己的 API 的请求...在任何浏览器中按 F12 并查看“网络”选项卡下,任何人都可以这样做来查看网站(任何网站)正在做。

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

您只需要意识到,如果您不做某事,您确实会遇到安全问题。您使用的技术堆栈与此无关。

【讨论】:

  • 我们不想保护我们的网络服务,我们想阻止从互联网访问网络服务。我们需要使 Web 服务器可以通过本地网络访问 Web 服务。目前客户端直接访问web服务,但是需要让客户端访问web服务器,web服务器访问web服务。
【解决方案2】:

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

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

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

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

如何授权访问网络服务

保护对 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。最受欢迎的 API 网关之一是 Kong

【讨论】:

    【解决方案3】:

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

    一种可能的解决方案是,

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

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

    或者,如果您创建基于 NodeJS、ASP.Net 的 Web 应用程序,它可以部署在可以与 Intranet Web 服务对话的边缘 Web 服务器上,并且用户(生活在互联网中)无法访问 Web直接服务。

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

    【讨论】:

    • 从您的回答来看,这意味着只有服务器端应用程序(ASP.NET、NodeJS)可以访问隐藏在本地网络上的 Web 服务,而客户端应用程序(Angular)不能访问 Web隐藏在本地网络上的服务。对吗?
    • 是的。边缘服务器是具有网络的服务器,面向 Intranet 和 Internet 资源。在边缘服务器中部署 Web 服务可以访问 Intranet 和 Internet Web 服务。客户端应用程序将无法访问 Intranet 受限的 Web 资源。
    • @RinatNiyazov,有什么悬而未决的问题吗?
    猜你喜欢
    • 2016-04-08
    • 2012-08-29
    • 2012-05-11
    • 2020-08-01
    • 2013-08-28
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多