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

146

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

Alex
источник

Ответы:

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, но если вы не установите их все для защиты, вы можете ожидать, что средство сканирования безопасности заметит, и вы увидите красные флажки в отчете. Спроси меня, откуда я знаю. :)

Джефф Мерглер
источник