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

时间:2019-03-26 10:40:00

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

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

这将是一个奇怪的请求,但: 我有一个外部URL,必须是HTTPS,而内部URL是仅HTTP。

我想知道如何将所有流量从端口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();

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

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

是否有任何方法可以根据我为其指定的端口从HTTP重定向到HTTPS? 谢谢

1 个答案:

答案 0 :(得分:2)

默认情况下,无论使用哪个端点访问应用程序,中间件管道都会运行。因此,如果您只执行app.UseHttpsRedirection(),那么HTTPS重定向中间件将为所有公共端点运行。

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

app.UseWhen(context => context.Request.Port == 888, httpApp =>
{
    httpApp.UseHttpsRedirection();
});

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

您要在此处执行的操作是将HTTP和HTTPS都托管在同一端口上,但这根本无法正常工作,因为没有机制可以确定客户端是否想在实际使用HTTP或HTTPS之前先进行操作试图建立两者之一。

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