ASP MVC 3 атрибут RequireHttps изменить все ссылки на https
У меня есть веб-сайт ASP MVC 3, который имеет форму обратной связи и должен требовать SSL.
Теперь у меня есть действие под названием Обратная связь внутри контроллера, называемого "ContactUs", который отвечает за просмотр и обработку обратной связи.
Когда я использовал [RequireHttps]
атрибут этого действия, он работает хорошо, и он меняет URL-адрес на "https". Однако я заметил, что все ссылки на моей странице теперь указывают на "https"! Как будто этот атрибут заставил механизм маршрутизации применить то же самое ко всем ссылкам!!!
Конечно, SSL требуется только для этого единственного действия, а все остальные должны иметь нормальный http.
Может кто-нибудь сказать мне, как решить эту проблему?
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]
не сделает текущий запрос или будущие запросы намного быстрее.
Вы можете создать другой пользовательский атрибут фильтра, чтобы вернуться к http. Попробуйте решение из этого вопроса... Почему, если SSL включен с [RequireHttps] на уровне действия, он остается включенным навсегда?