як атрибут SameSite автоматично додається до мого файлу cookie Asp.net_SessionID?


20

Останнім часом samesite = lax додати автоматично до мого файлу cookie сесії! цей атрибут просто додати до sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Мій веб-сайт розміщений на IIS 8.5, Windows 2012 R2 і не має WAF або UrlRewrite, і я вимикаю AntiVirus (kasper).

але все ж є однакові проблеми на деяких серверах клієнтів.

будь-яка ідея?

ВІДМОВЛЕНО: Я знаходжу це: https://support.microsoft.com/en-us/help/4524419/kb4524419

Тепер ASP.NET видасть заголовок файлу cookie SameSite, коли значення HttpCookie.SameSite - "None", щоб приєднати майбутні зміни до обробки файлів cookie SameSite в Chrome. У рамках цієї зміни файли cookie FormsAuth та SessionState також будуть видані з SameSite = 'Lax' замість попереднього за замовчуванням 'None', хоча ці значення можуть бути замінені в web.config.

Як я можу замінити файли cookie на Samesite для SessionState у web.config? я додаю цей рядок, але він не працює на файлі cookie SessionID! <httpCookies sameSite="Unspecified" />

РЕДАКТИРОВАНО: Я знаходжу це: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sesionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

Встановіть Samesite для stateserver за допомогою атрибута cookieSameSite тега SessionState.


Ви можете вирішити це, додавши "<sessiontate CookieSameSite"? У мене встановлено 4.8, але коли я отримую доступ до розділу
session session

1
Я отримую те ж повідомлення в iis, але воно працює і змінює значення samesite за встановлений час cookie. я додаю cookieSameSite = "None" до свого web.config, щоб отримати попередню поведінку. зауважте, що cookieSameSite є caseSesitive.
Sadegh

Мені просто довелося зафіксувати застарілий сайт 4.5.2 для цього - SameSite не підтримувався конфігураціями, тому мені довелося перехопити файли cookie на Session_Start і переписати його безпосередньо, додавши "SameSite = None; Безпечний".
ParanoidCoder

@ParanoidCoder танк для вашої пропозиції, я використовую .net 4.6.1, і це працює для мене. Але у мене є питання щодо вашого рішення: ви використовуєте перезапис URL-адрес (розширення IIS) або переписуєте його за кодом у Session_Start, чи можете ви показати мені свій код?
Садє

Відповіді:


19

Додайте ці параметри до web.config для sameSite = None, Lax або Strict

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>

1
<httpCookies sameSiteне відображається як допустимий варіант у .Net Framework 4.8
IronSean

Чи працює це за рамками 4.6.1?
Ankush Jain

@AnkushJain, ні, він підтримується з .Net Framework 4.7.2.
Василь Зверев

11

Я не можу використовувати переписувати, оскільки UrlRewrite встановлений не на всіх моїх серверах клієнтів.

Нарешті я додаю cookieSameSite до свого web.config:

<sessionState mode="StateServer" cookieSameSite="None" sqlConnectionString="data source=(local);user id=sa;password=" cookieless="false" timeout="20" />


2
він працює лише після .net 4.7.2
mrlayeghi

1
я використовую його в .net 4.6.1, і він прекрасно працює.
Садег

Вибачте @ Sadegh.K, але він не працюватиме до 4.7.2, як зазначено тут: docs.microsoft.com/en-us/aspnet/samesite/…
cederlof

@cederlof я знайшов це: support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh

@Sadegh Право, але це не додає cookieSameSiteфункціональності до web.config - .NET 4.7.2. Посилання, яке я опублікував у своєму коментарі, також пов’язане зі сторінки, на яку ви посилаєтесь.
cederlof

8

Атрибут CookieSameSite недоступний для багатьох старих рамок. Якщо у вас є ситуація, коли прийнята відповідь не підтримується у вашому оточенні, читайте далі!

Я змінив декілька відповідей SO, щоб створити це перезапис URL-адрес, що додає SameSite=Noneдо сесійних файлів cookie, а також видалити SameSite=Noneз усіх файлів cookie для більшості несумісних браузерів. Метою цього переписування є збереження "спадщини" поведінки до Chrome 80.

Повна реєстрація в моєму блозі Coder Frontline :

<rewrite>
  <outboundRules>
    <preConditions>
      <!-- Checks User Agent to identify browsers incompatible with SameSite=None -->
      <preCondition name="IncompatibleWithSameSiteNone" logicalGrouping="MatchAny">
        <add input="{HTTP_USER_AGENT}" pattern="(CPU iPhone OS 12)|(iPad; CPU OS 12)" />
        <add input="{HTTP_USER_AGENT}" pattern="(Chrome/5)|(Chrome/6)" />
        <add input="{HTTP_USER_AGENT}" pattern="( OS X 10_14).*(Version/).*((Safari)|(KHTML, like Gecko)$)" />
      </preCondition>
    </preConditions>

    <!-- Adds or changes SameSite to None for the session cookie -->
    <!-- Note that secure header is also required by Chrome and should not be added here -->
    <rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*ASP.NET_SessionId.*)" />
      <!-- Use this regex if your OS/framework/app adds SameSite=Lax automatically to the end of the cookie -->
      <!-- <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)" /> -->
      <action type="Rewrite" value="{R:1}; SameSite=None" />
    </rule>

    <!-- Removes SameSite=None header from all cookies, for most incompatible browsers -->
    <rule name="CookieRemoveSameSiteNone" preCondition="IncompatibleWithSameSiteNone">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=None)" />
      <action type="Rewrite" value="{R:1}" />
    </rule>
  </outboundRules>
</rewrite>

Це повинно працювати для більшості програм ASP .Net та ASP .Net Core, хоча нові рамки мають належні параметри коду та конфігурації, які дозволяють вам контролювати цю поведінку. Я рекомендую вивчити всі наявні у вас варіанти, перш ніж використовувати переписаний вище.


Де ви це помістили в MVC 5? В <system.net></system.net>?
Джоель Віклунд

In<system.webServer>
zemien

Примітка: якщо файл ASP.NET_SessionId-cookie вже є, SameSite=Laxвін лише додається, SameSite=Noneа не замінить його.
cederlof

@zemien Я не розумію, чому взагалі є (SameSite=.*)?в шаблоні?
cederlof

1
@cederlof ти маєш рацію! Я не перевіряв належним чином свій регекс, тому що моє середовище було старшим. Net Framework, який не додав властивість Lax автоматично. У вашому випадку ви можете використовувати інший регулярний вираз, щоб виключити SameSite=Laxзаголовок: ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)Див. Оновлений regex101.com/r/7D9UdO/3 - однак зауважте, що цей регулярний вираз виключатиме все, що згодом ви хочете, наприклад захищений заголовок. Це має бути рідкісним умовою, тому ключовим моментом є те, щоб побачити, що випускає ваша ОС + Framework + додаток, і написати регулярний вираз. Я
оновлю

7

Останнє оновлення: відповідь zemien є більш вичерпною та повною, ніж моя. оскільки він встановлює файли cookie на основі агента користувача.

Моя відповідь:

Ви можете замінити SameSite = Lax на SameSite = Немає для ASP.NET_SessionId в web.config наступним чином:

<rewrite>
  <outboundRules>
    <rule name="AddSameSiteCookieFlag">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(SameSite=Lax)" />
      <action type="Rewrite" value="{R:1};SameSite=None" />
    </rule>
  </outboundRules>
</rewrite>

Оновлення: щоб запобігти проблемі з IOS , замініть

<action type="Rewrite" value="{R:1};SameSite=None" />

з

<action type="Rewrite" value="{R:1};" />

2
Це можливо лише в тому випадку, якщо на сервері встановлений модуль перезапису IIS
Вінсент Дукрокет

1
Оновлення для проблеми iOS також спричинить проблеми в нових ОС. В основному, деякі браузери / ОС призначать SameSite = Lax, якщо в ньому відсутній заголовок SameSite. Я вважаю, що єдиний спосіб - це зробити нюхання UserAgent і вирішити, включати заголовка чи ні. Я все ще досліджую, чи можна це зробити через web.config чи він повинен включати зміну коду в Session_Start.
zemien

Щоб виділити те, що пише @zemien, ваше iOS-оновлення виправляє одну проблему, але вводить іншу.
cederlof

3

@zemien ваше рішення правильно вирішило наші проблеми з Google Chrome

У нас є інтеграція, коли наша програма вбудована в рамку третьої сторони. Версія Chrome 80, випущена 4 лютого 2020 року, не дозволяла завантажувати файли cookie.

Однак мені довелося змінити шаблон, щоб захопити всі файли cookie, додати прапор Secure та умову не застосовувати перезапис на localhost для нашого локального не https середовища

<rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)?" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="Rewrite" value="{R:1}; SameSite=None; Secure" />
</rule>

1

Працює для мене. Додано до мого файлу web.config:

<sessionState cookieSameSite="None"></sessionState>

Оновлення до .Net Framework 4.8 + патч встановлення: 2019-12 накопичувальне оновлення для .NET Framework 3.5 та 4.8 для Windows 10 версії 1909 для x64 (KB4533002)

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