使用 Kestrel 仅针对特定端口进行 HTTPS 重定向(侦听混合端口)

Que*_*ner 2 c# kestrel .net-core kestrel-http-server asp.net-core

使用 .NET Core 2.1、C#、Kestrel。

这将是一个奇怪的请求,但是:我有一个需要 HTTPS 的外部 URL 和一个仅是 HTTP 的内部 URL。

我想知道如何将端口 443 上的任何流量重定向到 HTTP 到 HTTPS(保持在同一端口 443);目前它停留在 HTTP 上并死于可怕的死亡。

(注意:端口 888 仍为 HTTP,任何到达那里的流量都需要保持为不安全的 HTTP。)

我在 Program.cs 中设置了它,如下所示:

WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(options =>
        {
            options.Listen(IPAddress.Any, 443, opts=>
            {
                opts.UseHttps("mycert.pfx");
            });

            options.Listen(IPAddress.Any, 888);
        })
    .Build();
Run Code Online (Sandbox Code Playgroud)

在启动时,我尝试使用 Configure(IApplicationBuilder app...) app.UseHttpsRedirection();

但这导致两个端口上的所有流量都被重定向到 HTTPS,这对 888 来说是一个问题,因为它没有 SSL 证书!

有什么方法可以根据我指定的端口从 HTTP 重定向到 HTTPS?谢谢

pok*_*oke 6

无论使用什么端点访问您的应用程序,中间件管道都会默认运行。因此,如果您只是这样做app.UseHttpsRedirection(),那么 HTTPS 重定向中间件将为您的所有公共端点运行。

UseWhen当中间件仅在特定条件下添加时,有一种使用机制允许您设置条件中间件管道。这看起来像这样:

app.UseWhen(context => context.Request.Port == 888, httpApp =>
{
    httpApp.UseHttpsRedirection();
});
Run Code Online (Sandbox Code Playgroud)

但是,在您的情况下,这无济于事:问题在于,在单个端口上,您只能托管一个事物。因此,如果您想在端口 443 上使用 HTTPS 托管您的应用程序,那么它只会在那里接受 HTTPS。如果您尝试使用不安全的 HTTP 进行连接,那么它将失败,因为它无法执行必要的握手。

您在这里想要做的是在同一端口上同时托管 HTTP 和 HTTPS 但这根本不起作用,因为没有一种机制可以在客户端实际尝试建立之前确定它们是要执行 HTTP 还是 HTTPS任何一个。

所以不,您不能将端口 443 上的 HTTP 重定向到端口 443 上的 HTTPS。