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

问题描述 投票:2回答:1

使用.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();

在Startup上,我尝试使用Configure(IApplicationBuilder app ...)app.UseHttpsRedirection();

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

有没有办法从HTTP重定向到HTTPS,具体取决于我指定的端口?谢谢

c# asp.net-core .net-core kestrel-http-server kestrel
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.