【问题标题】:Linux ASP.Net core with Apache and reverse proxy带有 Apache 和反向代理的 Linux ASP.Net 核心
【发布时间】:2019-02-21 05:48:41
【问题描述】:

我需要澄清 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
});

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

在 Program.cs 我有:

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

我的问题:

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

【问题讨论】:

    标签: c# apache asp.net-core kestrel-http-server


    【解决方案1】:

    我是否需要这些 Forwarded 标头?

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

    这意味着您的应用只知道内部请求,因此例如也只能生成内部 URL。为了让您的应用了解外部 URL,然后您可以使用由反向代理提供的那些转发标头,以允许您的应用恢复原始请求的样子。这样一来,您的应用就会知道公共请求并可以正确响应。

    我需要将app.UseHttpsRedirection(); 添加到我的项目中吗?

    不一定。 HTTPS 重定向基本上是一项功能,它将通过重定向到 HTTPS 自动响应对 HTTP 的请求。通常,您的应用前面的反向代理会处理此问题,因此在直接暴露 Kestrel 的情况下使用此功能最有意义。

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

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

    我需要在此行中指定UseUrls("https://*:5001") https 还是可以是http?

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

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

    我是否需要在我的 Kestrel(我的应用程序)上使用 https,或者如果我有反向代理,我可以使用 http,而 Apache 会处理 ssl?

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

    我的 ASP.NET Core 应用程序中是否需要任何其他代码才能使其与反向代理一起使用?

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

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      相关资源
      最近更新 更多