Из часто задаваемых вопросов MVC (на аналогичный вопрос ответил гуру безопасности Леви) с просьбой указать атрибут, не использующий SSL.
• Атрибут [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] не будет выполнять текущий запрос или будущее запросы гораздо быстрее.