【问题标题】:Serve static files to specific IP addresses将静态文件提供给特定 IP 地址
【发布时间】:2021-07-07 15:38:35
【问题描述】:

我有一个项目,我目前正在从 .NET Core Web API wwwroot 文件夹中提供静态文件。它在 startup.cs 中使用 app.UseStaticFiles() 命令,它非常适合为我们的 SPA 前端提供服务。但是,我们有一个要求,我们需要一个对互联网开放的控制器调用,而其余的则被 IP 地址锁定。我似乎无法弄清楚的一件事是如何防止 Web API 将 wwwroot 文件夹中的静态文件提供给互联网,因为这些文件仅供内部使用。

我知道已经内置了通过 IP 地址锁定控制器的中间件,并且有很多方法可以自己制作,但我需要特别防止 wwwroot 文件夹中的前端 SPA 被互联网看到,同时只有少数几个控制器调用可以访问互联网。

有没有办法做到这一点?

【问题讨论】:

  • 最好的做法是把你的web服务器隐藏在一些像nginx这样的代理后面并通过配置来解决,你的项目应该专注于业务逻辑而不是基础设施。
  • this 有帮助吗?
  • @AliK 我已经研究过使用该方法,我需要提供三个文件,即 html、css 和 javascript。我还没有找到一种方法可以从一个控制器调用中发送所有三个文件,否则这将是一个可行的解决方案。
  • 你可以使用这个 Nuget:github.com/dustinmoris/Firewall。它添加了带有防火墙规则的可配置中间件,例如允许的 IP 地址。您在startup.cs 的配置中设置规则。您应该将 app.UseFirewall(); 放在您的 app.UseStaticFiles() 之前以及它们之前 app.UseEndpoints() 因为您只想将静态文件限制为防火墙规则。

标签: c# asp.net-core-webapi asp.net-core-3.1


【解决方案1】:

我能够使用 Michal Rosenbaum 提到的 Nuget 包来实现我所需要的。通过在路由和端点之后但在静态文件中间件之前添加防火墙,防火墙将仅在提供 wwwroot 文件时应用。作为额外的奖励,我能够进行试验并弄清楚如何锁定特定的 IP 地址以防止访问控制器(尽管它超出了此答案的范围)。现在,该应用将不再向未经授权的 IP 地址提供 SPA,但仍然可以从外部访问该 API,这正是我所需要的。

app.UseEndpoints(endpoints =>
        {
            endpoints
                .MapControllers();
        });

 var firewall =  FirewallRulesEngine
                .DenyAllAccess()
                .ExceptFromLocalhost()
                .ExceptFromIPAddresses(new[] { IPAddress.Parse("192.168.1.3"), IPAddress.Parse("192.168.1.8") });

  app.UseFirewall(firewall);    
  app.UseDefaultFiles();
  app.UseStaticFiles();

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2020-04-26
    • 2019-04-13
    • 2018-11-04
    • 1970-01-01
    • 2016-01-06
    • 2021-10-19
    • 2016-08-27
    • 1970-01-01
    相关资源
    最近更新 更多