Skip to main content
 首页 » 编程设计

c#之带有 Apache 和反向代理的 Linux ASP.Net 核心

2024年02月25日33sharpest

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

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 
}); 

转发 header - 这些位于“如何在 Linux 上运行 ASP.NET Core”的文档中。

在 Program.cs 中我有:

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

我的问题:

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

请您参考如下方法:

Do I need these Forwarded headers at all?

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

这意味着您的应用程序只知道内部请求,因此也只能生成内部 URL。为了让您的应用程序了解外部 URL,您可以使用反向代理提供的那些转发 header ,以允许您的应用程序恢复原始请求的外观。这样,您的应用就会知道公共(public)请求并可以正确响应。

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

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

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

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

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

这还取决于您希望如何在内部设置您的应用程序。 通常,因为你的反向代理是公开可见的,你不需要在内部使用 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?

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