Перенаправление HTTPS только для определенного порта (прослушивание смешанных портов) с Kestrel - PullRequest
2 голосов
/ 26 марта 2019

Использование .NET Core 2.1, C #, Kestrel.

Это будет странный запрос, но: у меня есть внешний URL-адрес, для которого требуется HTTPS, и внутренний URL-адрес только для HTTP.

Мне интересно, как я могу перенаправить любой трафик на HTTP через порт 443 на 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 в зависимости от того, какой порт я его укажуза?Спасибо

1 Ответ

2 голосов
/ 26 марта 2019

Конвейер промежуточного программного обеспечения по умолчанию работает независимо от того, какая конечная точка используется для доступа к вашему приложению. Так что если вы просто выполните app.UseHttpsRedirection(), то промежуточное ПО перенаправления HTTPS будет работать для всех ваших публичных конечных точек.

Существует механизм, использующий UseWhen, который позволяет настроить условный конвейер промежуточного программного обеспечения, когда промежуточное программное обеспечение добавляется только в определенных условиях. Это будет выглядеть так:

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

Однако в вашей ситуации это не поможет: проблема в том, что на одном порту вы можете разместить только одну вещь. Поэтому, если вы хотите разместить приложение с HTTPS на порту 443, оно будет принимать только HTTPS. Если вы попытаетесь подключиться по небезопасному протоколу HTTP, произойдет сбой, поскольку он не может выполнить необходимое рукопожатие.

То, что вы хотели бы сделать здесь, - это разместить HTTP и HTTPS на одном и том же порту, но это просто не работает, поскольку нет механизма, позволяющего выяснить, хочет ли клиент выполнить HTTP или HTTPS, прежде чем он на самом деле уже существует. попытался установить либо.

Так что нет, вы не можете перенаправить HTTP через порт 443 на HTTPS через порт 443.

...