Як я можу встановити безпечний прапор на файлі cookie сесії ASP.NET?


146

Як я можу встановити прапор Secure на файлі cookie ASP.NET Session, щоб він передавався лише через HTTPS і ніколи не через звичайний HTTP?

Відповіді:


127

Є два способи, один httpCookiesелемент web.configдозволяє вмикати, requireSSLякий передає лише всі файли cookie, включаючи сеанс тільки в SSL, а також всередині автентифікації форм, але якщо ви включите SSL на httpcookies, ви також повинні ввімкнути його і в конфігурації форм.

Редагування для наочності: введіть це<system.web>

<httpCookies requireSSL="true" />

13
+1 Для уточнення, це те, що вам слід додати до web.config, щоб встановити захищений прапор <httpCookies requireSSL="true" />
автентичного

8
Зауважте, що це залежить від конфігурації на рівні сервера. Я припустив тестову область з помилкою "Програма налаштована на видачу захищених файлів cookie. Ці файли cookie вимагають від браузера надсилати запит через SSL (протокол https). Однак поточний запит не над SSL." Це було тому, що у нас є зворотний проксі-сервер і браузери підключаються до нього через SSL, але зворотний проксі-сервер на IIS-сервері понад порт 80, тому програма не думає, що він захищений.
mlhDev

4
@Bargitta Ми обробляли подію Application_PreSendRequestHeaders, і якщо певна настройка програми є правдою, ми встановлюємо всі файли cookie для захисту. Цей параметр програми встановлений лише для наших зовнішніх сайтів HTTPS.
mlhDev

Я бачу, тому весь ваш зовнішній сайт буде використовувати HTTPS, дякую.
Bargitta

Я бачив в іншому місці, що після IIS7 system.web був замінений system.webserver, тому я спробував поставити цю налаштування туди. На IIS 8.5 це спричинило помилку конфігурації, але все працювало, якщо я додав розділ system.web до файлу config і помістив налаштування туди.
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 патрабуSSSS = "true" />, включивши атрибут "lockItem". Приблизно так: <httpCookies RequSSSS = "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/…
Джефф Мерглер

додавши вищезазначені зміни у відповідні файли, об’єкти сеансу не працюють у моїй програмі, вони стають нульовими. як я можу тоді усунути цю проблему?
satya

Чи використовуєте ви 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>

Таким чином, на розробників не впливає (працює в Налагодженні), і лише сервери, які отримують версії версій, вимагають, щоб куки були SSL.


^^^ Це ^^^ шлях. Більше інформації про: Web.Config перетворює: go.microsoft.com/fwlink/?LinkId=125889
Джефф Мерглер

0

secure - Цей атрибут повідомляє браузеру надсилати файли cookie лише у випадку, коли запит надсилається через захищений канал, наприклад HTTPS. Це допоможе захистити файл cookie від передачі нешифрованих запитів. Якщо в програмі можна отримати доступ як через HTTP, так і HTTPS, існує певна можливість, що файл cookie може бути надісланий чітким текстом.


0

Спираючись на відповідь @Mark D, я б використовував web.config перетворення, щоб встановити всі різні файли cookie на безпечне. Це включає налаштування anonymousIdentification cookieRequireSSLта httpCookies requireSSL.

З цією метою ви налаштували веб-сторінку.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

Очевидно, що це виходить за рамки оригінального питання щодо ОП, але якщо ви не встановите їх на безпеку, ви можете розраховувати, що інструмент сканування безпеки помітить, і на звіті з’являться червоні прапори. Запитайте мене, як я знаю. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.