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

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

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

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

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

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


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


Ответы (2)


В вашем случае атрибут [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] не сильно усложнит текущий запрос или будущие запросы. Быстрее.

person RickAndMSFT    schedule 16.03.2012
comment
Спасибо за ответ. Я думаю, что мне следует использовать LinkExtensions.ActionLink, но я не знаю, как правильно его использовать. можете ли вы объяснить это мне, плз? - person Yousi; 08.04.2012
comment
может быть основным вопросом, как читайте здесь и здесь post запрос также зашифровывается, но хотелось бы узнать погоду, которую я также должен украсить RequireHttps в сообщении? - person Shaiju T; 22.02.2016

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

person kaps    schedule 15.03.2012
comment
Ваш файл cookie для входа в систему так же секретен, как ваше имя пользователя и пароль, и теперь вы отправляете его в открытом виде по сети. Кроме того, вы уже потратили время, чтобы выполнить рукопожатие и защитить канал (что является основной частью того, что делает HTTPS медленнее, чем HTTP) до запуска конвейера MVC, поэтому [RequireHttp] не будет выполнять текущий или будущий запрос. запросы намного быстрее. - person RickAndMSFT; 16.03.2012