Linux ASP.Net 核心与 Apache 和反向代理

Linux ASP.Net core with Apache and reverse proxy

我需要澄清 Linux 上 ASP.NET 核心应用程序的设置过程。我有 Apache 作为服务器,我想将它用作反向代理。在我的 ASP.NET 核心应用程序中,我有这样的设置:

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders =
        ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

转发 headers - 这些在 "How to run ASP.NET Core on Linux".

的文档中

在 Program.cs 我有:

var host = WebHost.CreateDefaultBuilder(args)
    .UseKestrel()
    .UseUrls("https://*:5001")
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

我的问题:

  1. 我需要这些转发的 headers 吗?
  2. 我需要将 app.UseHttpsRedirection(); 添加到我的项目中吗?
  3. 我需要在这一行中指定 UseUrls("https://*:5001") https 还是可以是 http?
  4. 我是否需要在我的 Kestrel(我的应用程序)上使用 https,或者如果我有反向代理,我可以使用 http 而 Apache 会处理 ssl?
  5. 我的 ASP.NET 核心应用程序中是否需要任何其他代码才能使其与反向代理一起工作?

Do I need these Forwarded headers at all?

总的来说,是的。反向代理的工作方式是它们基本上接收最终用户的请求,然后通过 发出新请求 将请求转发到您的应用程序。来自反向代理的新请求有自己的 header,对于您的应用程序,就好像从来没有 public 请求一样。

这意味着您的应用程序只知道内部请求,因此例如也只能生成内部 URLs。为了让您的应用了解外部 URLs,然后您使用反向代理提供的那些转发的 headers,以允许您的应用恢复原始请求的样子.这样,您的应用就会知道 public 请求并可以正确响应它。

Do I need to add app.UseHttpsRedirection(); into my project?

不一定。 HTTPS 重定向基本上是一种功能,它会自动通过重定向到 HTTPS 来响应对 HTTP 的请求。通常,您的应用程序前面的反向代理会处理此问题,因此此功能在与直接公开的 Kestrel 一起使用时最有意义。

但是如果您想在您的应用程序中而不是在您的反向代理中使用该功能,您仍然可以使用该功能。如果您的反向代理同时在 HTTP 和 HTTPS 上为您的应用提供服务,并且它还在转发 header 中正确转发方案,那么您的应用可以正确检测到这一点并重定向到 HTTPS。

从安全的角度来看,您的反向代理最好(也可能更简单)不将任何 HTTP 请求转发到您的应用程序,而是自行重定向到 HTTPS。

Do I need to specify UseUrls("https://*:5001") https in this line or it can be http?

这也取决于您希望如何在内部设置您的应用程序。 通常,因为您的反向代理是public唯一可见的代理,您不需要在内部使用 HTTPS,而且这通常也会带来更好的性能更少的开销(并且它降低了证书配置的复杂性)。但在某些情况下,您甚至可能希望在内部使用 HTTPS,以使您的应用程序更安全并更好地保护其传输的数据。不过,这完全取决于您。

我通常建议您不要使用 UseUrl() 调用,而只需使用 ASPNETCORE_URLS 环境变量来指定内部托管 URL 和端口。这样,您可以更灵活地应对环境变化,并且可以在部署应用程序时选择系统上的端口,而不必为了切换内部端口而重新编译应用程序。

Do I need to have https in general on my Kestrel (my application), or if I have reverse proxy I can use http and Apache will take care of ssl?

如上所述,设置通常您的反向代理托管在 HTTPS 上,并且反向代理和您的应用程序之间的内部通信可以使用 HTTP 进行。不过,您也完全可以选择在内部使用 HTTPS。

Do I need to have any other code in my ASP.NET Core app to make it works with reverse proxy?

不,为了让应用程序允许它 运行 在反向代理后面,您通常需要激活转发的 headers 中间件(或者 IISIntegration,如果您是 运行在 IIS 后面)。其余设置发生在反向代理上,您需要确保转发的 header 也已正确设置。