ASP MVC 3 атрибут RequireHttps изменить все ссылки на https - PullRequest
7 голосов
/ 15 марта 2012

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

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

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

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

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

Ответы [ 2 ]

13 голосов
/ 16 марта 2012

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

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

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

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

0 голосов
/ 15 марта 2012

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

...