【问题标题】:HTTPS redirection for specific port only (listening on mixed ports) with Kestrel使用 Kestrel 仅针对特定端口的 HTTPS 重定向(侦听混合端口)
【发布时间】:2019-08-16 17:11:14
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • Hero
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2018-11-10
    • 2019-02-20
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多