asp.net использует requireSSL и все еще сможет проверить, прошел ли пользователь аутентификацию на страницах без SSL

У меня есть веб-приложение (asp.net 3.5) со смешанным SSL. Все связанные с аккаунтом страницы доставляются по SSL. В основном все остальные страницы доставляются через не-ssl. Для автоматического переключения между HTTPS и HTTP я использую этот компонент. В последнее время появилась новость, касающаяся возможности захвата пользовательских сеансов в незащищенных сетях Wi-Fi. Это должно быть возможно путем перехвата Cookie, который передается по не-ssl-соединениям.

Это подтолкнуло меня к рассмотрению моих вариантов безопасности в этом веб-приложении. Я (снова) взял эту статью из MSDN и попробовал свойство requireSSL=true в моей проверке подлинности с помощью форм. Еще до того, как я запустил веб-приложение, я понял, что мой User.Identity будет нулевым на страницах, отличных от SSL, потому что файл cookie, содержащий эту информацию, не отправляется от и в веб-браузер.

Мне нужен механизм, который аутентифицирует пользователя через SSL-соединение... и запоминает эту информацию для аутентификации, даже на страницах без SSL.

При поиске ТАК я нашел этот пост. Мне кажется, что это хорошее решение. Но мне интересно, можно ли найти решение для хранения информации для входа в Sessionstate? Я подумываю о перехвате Application_AuthenticateRequest в Global.asax. Проверьте, безопасно ли соединение, и проверьте authcookie или Session. Я не знаю точно, как я собираюсь реализовать это еще. Может быть, вы можете подумать со мной об этом?

2 ответа

Решение

К сожалению, у вас есть противоречивые требования. У вас не может быть безопасного сеанса без использования SSL, поэтому я бы хотел оспорить ваше базовое предположение: почему бы не использовать весь сайт на SSL?

Из часто задаваемых вопросов 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] не будет выполнять текущий запрос или будущее запросы гораздо быстрее.

Другие вопросы по тегам