как атрибут 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, и я отключаю Антивирус (каспер).

но все же имеют такую ​​же проблему на некоторых клиентских серверах.

Есть идеи?

Отредактировано: я нахожу это: https://support.microsoft.com/en-us/help/4524419/kb4524419

ASP.NET теперь будет отправлять заголовок cookie SameSite, когда значение HttpCookie.SameSite равно «None» для учета предстоящих изменений в обработке cookie SameSite в Chrome. В рамках этого изменения файлы cookie FormsAuth и SessionState также будут выдаваться с SameSite = 'Lax' вместо предыдущего значения по умолчанию 'Нет', хотя эти значения могут быть переопределены в web.config.

Как я могу переопределить файлы cookie одного и того же сайта для SessionState в web.config? я добавляю эту строку, но она не работает с cookie SessionID! <httpCookies sameSite="Unspecified" />

РЕДАКТИРОВАНИЕ: Я нахожу это: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSiteSite

Установите тот же сайт для сервера состояний с помощью атрибута «cookieSameSite» тега SessionState.

Sadegh
источник
Получите ли вы разрешение этой проблемы, добавив «<sessionstate CookieSameSite"? У меня установлено 4.8, но когда я получаю доступ к разделу состояния сеанса из диспетчера IIS. Я просто получаю нераспознанный атрибут.
Jokies Ding
1
я получаю то же сообщение в iis, но оно работает и изменяет значение samesite во время set-cookie. я добавляю cookieSameSite = "None" в мой web.config, чтобы получить прежний вид. обратите внимание, что cookieSameSite является caseSesitive.
Садег
Для этого мне просто нужно было исправить устаревший сайт 4.5.2 - SameSite не поддерживался конфигами, поэтому мне пришлось перехватить cookie-файл на Session_Start и переписать его напрямую с добавлением «SameSite = None; Secure».
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>
HJ van der Wijk
источник
1
<httpCookies sameSiteне отображается в качестве допустимого параметра в .Net Framework 4.8
IronSean
Работает ли это для 4.6.1 framework?
Анкуш Джейн
@ 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" />

Sadegh
источник
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 Правильно, но это не добавляет 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, хотя более новые Frameworks имеют надлежащие параметры кода и конфигурации, позволяющие контролировать это поведение. Я бы порекомендовал изучить все варианты, доступные вам, прежде чем использовать мой переписать выше.

zemien
источник
Где вы положили это в MVC 5? В <system.net></system.net>?
Джоэл Виклунд
В<system.webServer>
Земень
Примечание. Если файл 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 - однако обратите внимание, что это регулярное выражение исключит все, что вы захотите впоследствии, например, безопасный заголовок. Это должно быть редким условием, поэтому ключевой момент заключается в том, чтобы увидеть, что излучает ваше приложение OS + framework +, и написать соответствующее регулярное выражение. Я
обновлю
7

Последнее обновление: ответ zemien является более полным и полным, чем мой. потому что он устанавливает cookie на основе пользовательского агента.

Мой ответ:

Вы можете заменить SameSite = Lax на SameSite = None для 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, ваше обновление iOS исправляет одну проблему, но представляет другую.
cederlof
4

@zemien ваше решение правильно решило наши проблемы с Google Chrome

У нас есть интеграция, в которой наше приложение встроено в iframe третьей стороны. Версия 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)

Stéphane
источник