UseHttpsRedirection не работает надежно?

#c# #asp.net #asp.net-core #razor-pages

#c# #asp.net #asp.net-core #страницы-бритвы

Вопрос:

Код запуска по умолчанию, созданный для моего ASP.NET Приложение Core Razor Pages включает в себя следующий код:

 app.UseHttpsRedirection();
  

Похоже, это ошибка. Прямо сейчас, на моем компьютере для разработки, редактирование URL-адреса в адресной строке, чтобы он использовал HTTP вместо HTTPS, выдает ошибку «Соединение было сброшено«.

Кроме того, я нашел AddRedirectToHttpsPermanent() параметр, который можно передать app.UseRewriter() .

На данный момент мне неясно, почему app.UseHttpsRedirection() не работает, или если я должен использовать UseRewriter() .

Кто-нибудь понял это?

Комментарии:

1. вы видели эту статью о доверии к ASP.NET SSL-сертификат для разработки ядра? Еще одна вещь, которую нужно проверить, это запустить VS (или любую другую среду IDE, которую вы используете) в качестве администратора и посмотреть, получите ли вы то же самое

2. @GlynnHurrell: По умолчанию мой проект выполняется в HTTPS на моей машине разработки. Вот почему я попытался изменить его на HTTP, чтобы посмотреть, что произошло. Возможно, я не понимаю вашу точку зрения.

3. Нет, вы правы, я пропустил вашу точку зрения. Ого!

Ответ №1:

TL; DR:

Перенаправление работает так, как ожидалось. HTTP и HTTPS используйте разные порты.

Только удалив s из URL: https://localhost:44336 , вы пытаетесь выполнить HTTP для порта приложения, который ожидает HTTPS , который не поддерживается. Чтобы перенаправление заработало, вам нужно связаться с HTTP портом, используя HTTP .

Используя указанный HTTP URL http://localhost:53640 , вы увидите, что приложение перенаправляется, как и ожидалось.

В моем примере, см. launchSettings.json это определено следующим образом:

 "applicationUrl": "http://localhost:53640"
  

Итак, что здесь происходит, это следующее:

В общем

  • «Порт HTTPS»* принимает только HTTPS (поэтому нет HTTP) соединений.
  • «Порт HTTP»* принимает только HTTP (поэтому нет HTTPS) соединений.

* в физическом мире нет такого понятия, как порт HTTPS или HTTP, поскольку он определен на уровне 7 OSI.

UseHttpsRedirection , маршрутизирует входящий HTTP-трафик на HTTP-порту в HTTPS-трафик на HTTPS-порту.

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

Случай с отладчиком

Чтобы предотвратить коллизии портов, Visual Studio по умолчанию использует нестандартные порты для отладки. Вы можете увидеть их в файле ‘launchSettings.json`.

Мой выглядит так:

  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:53640",
      "sslPort": 44336
    }
  },
  

Обратите внимание на 2 номера портов. Перенаправление работает только на (и к) указанным портам.

HTTP принимается на 53640, HTTPS принимается на 44336.

Ваш вариант использования

Изменяя удаление s в строке URL, вы меняете:

https://localhost:44336

Для

http://localhost:44336

Обратите внимание, поскольку вы не настроили порт, вы пытаетесь подключиться с помощью HTTP через порт HTTPS. Этот сценарий не покрывается перенаправлением и завершится неудачей.

Только http://localhost:53640 будет перенаправлять на https://localhost:44336 . Просто HTTP: http://localhost:44336 приведет к сбросу соединения.

Корпус производственного сервера

В обычных обстоятельствах вы отправляете свое приложение на веб-сервер, используя порты по умолчанию (80 для HTTP и 443 для HTTPS, с соответствующим сертификатом).

Поскольку браузер, который использует пользователь, также использует эти порты по умолчанию, перенаправление работает хорошо, поскольку:

http://example.org фактически переведет на http://example.org:80 и https://example.org переведет на https://example.org:443

и, таким образом, это волшебным образом сработает из коробки:

http://example.org:80 перенаправит на https://example.org:443

Браузер просто не показывает номера портов. Чтобы найти launchSettings.json файл: файл в VS:

введите описание изображения здесь


В качестве альтернативы

Если это не поможет, возможно, порядок app.Use... неправильный.

В основном это расширения, регистрирующие промежуточное программное обеспечение. Порядок важен.

Обычно сначала настраивается перенаправление, а затем MVC. Вот так:

 app.UseHttpsRedirection(); 
app.UseMvc();
app.UseOtherMiddleWare();
  

Если вы измените порядок, возможно, вы столкнетесь с ошибкой ранее в конвейере, и перенаправление не будет выполнено.

Комментарии:

1. Что ж, мастера Visual Studio решили, где app.UseHttpsRedirection() было размещено. Кроме того, я не использую app.UseMvc() в приложениях Razor Pages.