Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Атрибут ASP MVC 3 RequireHttps изменяет все ссылки на https

Автор вопроса: YousiОтветов: 2

У меня есть веб-сайт ASP MVC 3, который имеет форму обратной связи и должен требовать SSL.

Теперь у меня есть действие Feedback внутри контроллера ContactUs, которое отвечает за просмотр и обработку отзывов.

Когда я использовал атрибут [RequireHttps] для этого действия, он работает хорошо и меняет URL-адрес на "https". Однако я заметил, что все ссылки внутри моей страницы теперь указывают на "https"! Как будто этот атрибут заставил механизм маршрутизации применять одно и то же ко всем ссылкам!!!

Конечно, SSL требуется только для этого единственного действия, а все остальные должны иметь обычный http.

Может ли кто-нибудь сказать мне, как это решить?

  • Почему на других ваших страницах требуется только http? Действительно ли имеет значение, являются ли они https или нет, если страницы, которые ДЕЙСТВИТЕЛЬНО требуют https, зашифрованы? Erik Funkenbusch 16.03.2012
  • @Mystere Man: https сильно снижает производительность веб-сервера. В некоторых конфигурациях это может иметь большое значение. Andrew Savinykh 03.07.2012
  • @zespri - В прошлые дни https был значительной нагрузкой. Сегодня я гарантирую вам, что серверы больше работают над созданием страниц, чем над их шифрованием. Вы говорите, что скорее сделаете свой сайт небезопасным, чем столкнетесь с небольшим увеличением нагрузки. Рикс указывает ниже, что вы уже создали нагрузку, потребовав вход в систему https, и будущие запросы не потребуют дополнительной обработки. Erik Funkenbusch 03.07.2012
  • Я говорю, что не хотел бы добавлять совершенно ненужные и необоснованные накладные расходы. Публичная часть сайта, которая не содержит никаких пользовательских данных, просто не требует https. Нет смысла добавлять эти накладные расходы. Также https добавляет накладные расходы на каждый запрос, так как вам нужно шифровать/расшифровывать данные при каждом запросе. Andrew Savinykh 03.07.2012

hyperlinkactionlinkrequirehttps

Ответы

Ответ 1 · рейтинг 13 · RickAndMSFT

В вашем случае атрибут [RequireHttp] может быть в порядке, если вы очистите файл cookie для входа, или вы будете отправлять его в открытом виде по сети. Это может быть больше работы, чем того стоит, чтобы избежать небольших затрат на дальнейшие вызовы HTTPS. SO посвящен повторному использованию вопросов, и другие пользователи, читающие ваш вопрос, могут подумать, что можно перейти к HTTP после входа в систему, хотя обычно это неправильно.

Атрибут [RequireHttps] можно использовать для типа контроллера или метода действия, чтобы сказать, что "доступ к этому можно получить только через SSL". Не-SSL-запросы к контроллеру или действию будут перенаправлены на версию SSL (если HTTP GET) или отклонены (если HTTP POST). Вы можете переопределить RequireHttpsAttribute и изменить это поведение, если хотите. Нет встроенного атрибута [RequireHttp], который делал бы обратное, но вы можете легко создать свой собственный, если хотите.

Существуют также перегрузки Html.ActionLink(), которые принимают параметр протокола; вы можете явно указать "http" или "https" в качестве протокола. Вот документация MSDN по одной из таких перегрузок. Если вы не укажете протокол или вызовете перегрузку, которая не имеет параметра протокола, предполагается, что вы хотите, чтобы ссылка имела тот же протокол, что и текущий запрос.

Причина, по которой у нас нет атрибута [RequireHttp] в MVC, заключается в том, что от него мало пользы. Это не так интересно, как [RequireHttps], и побуждает пользователей делать неправильные вещи. Например, многие веб-сайты входят в систему через SSL и перенаправляют обратно на HTTP после входа в систему, что абсолютно неправильно. Ваш файл cookie для входа в систему так же секретен, как ваше имя пользователя и пароль, и теперь вы отправляете его в открытом виде по сети. Кроме того, вы уже потратили время, чтобы выполнить рукопожатие и защитить канал (что является основной частью того, что делает HTTPS медленнее, чем HTTP) до запуска конвейера MVC, поэтому [RequireHttp] не сильно усложнит текущий запрос или будущие запросы. Быстрее.

Ответ 2 · kaps

Вы можете создать другой атрибут пользовательского фильтра, чтобы вернуться к http. Попробуйте решить этот вопрос... Почему после включения SSL с помощью [RequireHttps] на уровне действия он остается включенным навсегда?

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы