Мы поняли это.
Каким-то образом атрибут «SameSite» cookie «ASP.NET_SessionId» по умолчанию имеет значение «Lax», и это приводит к тому, что cookie-файл сеанса не добавляется к запросу, выполненному кодом JavaScript шлюза оплаты.
Мы добавили следующее правило в файл web.config, чтобы переопределить это значение и установить для него значение «Нет».
<configuration>
<system.webServer>
<rewrite>
<outboundRules>
<rule name="Add SameSite" preCondition="No SameSite">
<match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
<action type="Rewrite" value="{R:0}; SameSite=None" />
<conditions>
</conditions>
</rule>
<preConditions>
<preCondition name="No SameSite">
<add input="{RESPONSE_Set_Cookie}" pattern="." />
<add input="{RESPONSE_Set_Cookie}" pattern="; SameSite=None" negate="true" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
ОБНОВЛЕНИЕ 1 : просто добавление вышеуказанной конфигурации решило проблему для современных браузеров, но мы поняли, что у нас все еще есть проблемы со старыми версиями Micosoft Edge и Internet Explorer.
Поэтому нам нужно было добавить атрибут cookieSameSite = "None" в узел sessionState в файле web.config.
<sessionState cookieSameSite="None" />
Будьте осторожны с этим изменением конфигурации, так как более старые версии .net Framework не поддерживают его и приводят к тому, что ваш сайт отображает страницу с ошибкой.
Кстати, у нас все еще есть проблемы с браузерами в IOS 12. Но я думаю, что это связано с этой подтвержденной ошибкой
ОБНОВЛЕНИЕ 2 : см. Ответ zemien для возможного решения проблемы IOS
ОБНОВЛЕНИЕ 3 : Объединив наши выводы с предложениями в ответе zemien, мы разработали следующие правила переписывания. Мы использовали эту конфигурацию в производстве. Но будьте осторожны: он помечает все файлы cookie атрибутом «SameSite: None» для совместимых браузеров и исключает атрибут SameSite, если он существует, для несовместимых браузеров. Это может показаться сложным, но я попытался объяснить это с помощью комментариев.
Это финальная конфигурация, которую мы используем в производстве:
<configuration>
<system.webServer>
<rewrite>
<outboundRules>
<preConditions>
<!-- 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>
<!-- Rest of the browsers are assumed to be compatible with SameSite=None -->
<preCondition name="CompatibleWithSameSiteNone" logicalGrouping="MatchAll">
<add input="{HTTP_USER_AGENT}" pattern="(CPU iPhone OS 12)|(iPad; CPU OS 12)" negate="true" />
<add input="{HTTP_USER_AGENT}" pattern="(Chrome/5)|(Chrome/6)" negate="true" />
<add input="{HTTP_USER_AGENT}" pattern="( OS X 10_14).*(Version/).*((Safari)|(KHTML, like Gecko)$)" negate="true" />
</preCondition>
</preConditions>
<!-- Rule 1: Remove SameSite part from cookie for incompatible browsers if exists -->
<rule name="Remove_SameSiteCookie_IfExists_ForLegacyBrowsers" preCondition="IncompatibleWithSameSiteNone">
<match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)" />
<action type="Rewrite" value="{R:1}" />
</rule>
<!-- Rule 2: Override SameSite's value to None if exists, for compatible browsers -->
<rule name="Override_SameSiteCookie_IfExists_ForModernBrowsers" preCondition="CompatibleWithSameSiteNone">
<match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)" />
<action type="Rewrite" value="{R:1}; SameSite=None" />
</rule>
<!-- Rule 3: Add SameSite attribute with the value None if it does not exists, for compatible browsers -->
<rule name="Add_SameSiteCookie_IfNotExists_ForModernBrowsers" preCondition="CompatibleWithSameSiteNone">
<match serverVariable="RESPONSE_Set-Cookie" pattern=".*"/>
<!-- Condition explanation: Cookie data contains some string value but does not contain SameSite attribute -->
<conditions logicalGrouping="MatchAll">
<add input="{R:0}" pattern="^(?!\s*$).+"/>
<add input="{R:0}" pattern="SameSite=.*" negate="true"/>
</conditions>
<action type="Rewrite" value="{R:0}; SameSite=None" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
Я изменил несколько ответов SO, чтобы придумать переписывание URL-адреса, которое добавляет
SameSite=None
файлы cookie сеанса, а также удалитьSameSite=None
из всех файлов cookie для большинства несовместимых браузеров. Целью этого переписывания является сохранение «устаревшего» поведения до Chrome 80.Полная информация в моем блоге Coder Frontline :
Это должно работать для большинства приложений ASP .Net и ASP .Net Core, хотя более новые Frameworks имеют надлежащие параметры кода и конфигурации, позволяющие контролировать это поведение. Я бы порекомендовал изучить все варианты, доступные вам, прежде чем использовать мой переписать выше.
источник