Как я могу установить флаг безопасности для файла cookie сеанса ASP.NET?


146

Как установить флажок Secure для файла cookie сеанса ASP.NET, чтобы он передавался только по HTTPS, а не по обычному HTTP?

Ответы:


127

Есть два способа, один httpCookiesэлемент в которых web.configпозволяет вам включать requireSSLтолько те куки, включая сеанс только в SSL, а также внутри аутентификации форм, но если вы включаете SSL в httpcookies, вы также должны включить его и внутри конфигурации форм.

Отредактируйте для ясности: вставьте это в<system.web>

<httpCookies requireSSL="true" />

13
+1 Чтобы уточнить, это то, что вы должны добавить в файл web.config, чтобы установить для флага безопасности в файле cookie аутентификации значение true<httpCookies requireSSL="true" />
— Tr1stan

8
Обратите внимание, что это зависит от вашей конфигурации (на уровне сервера). Я вызвал тестовый регион с ошибкой «Приложение настроено на выдачу безопасных файлов cookie. Эти файлы cookie требуют, чтобы браузер отправлял запрос по SSL (протокол https). Однако текущий запрос не по SSL». Это произошло потому, что у нас есть обратный прокси-сервер и браузеры подключаются к нему через SSL, но обратный прокси-сервер к серверу IIS подключен через порт 80, поэтому приложение не считает, что оно защищено.
— mlhDev

4
@Bargitta Мы обработали событие Application_PreSendRequestHeaders и, если для определенного параметра приложения задано значение true, мы устанавливаем все куки-файлы как безопасные. Этот параметр приложения установлен только для наших внешних сайтов HTTPS.
— mlhDev

Я вижу, так что все ваши внешние сайты будут использовать HTTPS, спасибо.
— Баргитта

В другом месте я видел, что после того, как IIS7 system.web был заменен system.webserver, я попытался установить этот параметр там. На IIS 8.5 это вызвало ошибку конфигурации, но все заработало, если я добавил раздел system.web в файл конфигурации и вставил туда настройку.
— Eborbob

181

В <system.web>элемент добавьте следующий элемент:

<httpCookies requireSSL="true" />

Однако, если у вас есть <forms>элемент в вашем system.web\authenticationблоке, это переопределит настройку в httpCookies, установив его обратно в значение по умолчанию false.

В этом случае вам также необходимо добавить requireSSL="true"атрибут в элемент формы.

Так что в итоге вы получите:

<system.web>
    <authentication mode="Forms">
        <forms requireSSL="true">
            <!-- forms content -->
        </forms>
    </authentication>
</system.web>

Смотрите здесь и здесь для MSDN документации этих элементов.


2
Вы можете избежать других настроек web.config, переопределяющих настройки <httpCookies requireSSL = "true" />, добавив атрибут 'lockItem'. Примерно так: <httpCookies requireSSL = "true" lockItem = "true" />. Более подробная информация здесь dotnetnoob.com/2010/11/how-to-secure-aspnet-cookies.html
— JTech,

1
Кроме того, если есть roleManagerэлемент, его атрибут cookieRequireSSL="true"также должен быть установлен в true. Ссылка msdn.microsoft.com/en-us/library/…
— Джефф Мерглер

добавив вышеуказанные изменения в связанные файлы, объекты сеанса не работают в моем приложении, они становятся нулевыми. как я могу исправить эту проблему тогда?
— сатья

Вы используете HTTP или HTTPS для своего приложения? Установленный здесь «безопасный» флаг предотвращает отправку файлов cookie по незашифрованным (т. Е. HTTP) соединениям
— Martin Eden,

21

Все становится быстро, если вы говорите о проверенном коде в корпоративной среде. Мы обнаружили, что наилучшим подходом является наличие в файле web.Release.config следующего содержания:

<system.web>
  <compilation xdt:Transform="RemoveAttributes(debug)" />
  <authentication>
      <forms xdt:Transform="Replace" timeout="20" requireSSL="true" />
  </authentication>
</system.web>

Таким образом, разработчики не будут затронуты (работают в Debug), и только те серверы, которые получают сборки Release, требуют, чтобы куки были SSL.


^^^ Это ^^^ это путь. Дополнительная информация: преобразования Web.Config: go.microsoft.com/fwlink/?LinkId=125889
— Джефф Мерглер,

0

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


0

Основываясь на ответе @Mark D, я бы использовал преобразования web.config, чтобы установить для всех различных файлов cookie значение Secure. Это включает в себя настройку anonymousIdentification cookieRequireSSLи httpCookies requireSSL.

Для этого вы должны настроить свой web.Release.config как:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
  </system.web>
</configuration>

Если вы используете роли и формы проверки подлинности с ASP.NET Membership Provider(я знаю, это древний) , вы также хотите установить roleManager cookieRequireSSLи те forms requireSSLатрибуты надежно защищены. Если это так, ваш web.release.config может выглядеть так (включен выше, плюс новые теги для членства API):

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
    <roleManager xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" />
    <authentication>
        <forms xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    </authentication>
  </system.web>
</configuration>

Фон на web.config преобразуется здесь: http://go.microsoft.com/fwlink/?LinkId=125889

Очевидно, что это выходит за рамки первоначального вопроса OP, но если вы не установите их все для защиты, вы можете ожидать, что средство сканирования безопасности заметит, и вы увидите красные флажки в отчете. Спроси меня, откуда я знаю. :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.