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

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


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


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


智慧大石
浏览 166回答 1
1回答

慕田峪4524236

默认情况下,中间件管道会运行,而不管使用什么端点来访问您的应用程序。因此,如果您只是这样做app.UseHttpsRedirection(),那么 HTTPS 重定向中间件将为您的所有公共端点运行。当仅在特定条件下添加中间件时,有一种机制UseWhen允许您设置条件中间件管道。这看起来像这样:app.UseWhen(context => context.Request.Port == 888, httpApp =>{&nbsp; &nbsp; httpApp.UseHttpsRedirection();});但是,在您的情况下,这无济于事:问题是在单个端口上,您只能托管一个东西。因此,如果您想在端口 443 上使用 HTTPS 托管您的应用程序,那么它将只接受 HTTPS。如果您尝试使用不安全的 HTTP 进行连接,那么它将失败,因为它无法执行必要的握手。你想在这里做的是在同一个端口上同时托管 HTTP 和 HTTPS,但这根本行不通,因为没有一种机制可以在客户端实际已经尝试建立之前确定客户端是否想要执行 HTTP 或 HTTPS任何一个。所以不,您不能将端口 443 上的 HTTP 重定向到端口 443 上的 HTTPS。
打开App,查看更多内容
随时随地看视频慕课网APP