Kami menemukan jawabannya.
Entah bagaimana "ASP.NET_SessionId" cookie "SameSite" atribut default ke "Lax" dan ini menyebabkan cookie sesi tidak ditambahkan ke permintaan yang dibuat oleh kode javascript gateway pembayaran.
Kami menambahkan aturan berikut ke file web.config untuk mengganti nilai ini dan mengaturnya ke "Tidak Ada".
<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>
PEMBARUAN 1 : Hanya menambahkan konfigurasi di atas memecahkan masalah untuk peramban modern tetapi kami menyadari bahwa kami masih mengalami masalah dengan versi lama Micosoft Edge dan Internet Explorer.
Jadi kami perlu menambahkan atribut cookieSameSite = "None" ke node sessionState di file web.config.
<sessionState cookieSameSite="None" />
Hati-hati dengan perubahan konfigurasi ini, karena versi .net framework yang lebih lama tidak mendukungnya dan menyebabkan situs Anda menampilkan halaman kesalahan.
Omong-omong, kami masih mengalami masalah dengan browser di iOS 12. Tapi saya pikir ini terkait dengan bug yang dikonfirmasi ini
UPDATE 2 : lihat jawaban zemien untuk kemungkinan perbaikan tentang masalah IOS
UPDATE 3 : Dengan menggabungkan temuan kami dengan saran dalam jawaban zemien, kami telah membuat aturan penulisan ulang berikut. Kami telah menggunakan konfigurasi ini dalam produksi. Namun berhati-hatilah: ini menandai semua cookie dengan atribut "SameSite: None" untuk browser yang kompatibel dan mengecualikan atribut SameSite, jika ada, untuk browser yang tidak kompatibel. Ini mungkin terlihat rumit tetapi saya mencoba menjelaskan melalui baris komentar.
Ini adalah konfigurasi FINAL yang kami gunakan dalam produksi:
<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>
Saya memodifikasi beberapa jawaban SO untuk membuat penulisan ulang URL ini yang menambah
SameSite=None
cookie sesi, dan juga menghapusSameSite=None
dari semua cookie untuk sebagian besar browser yang tidak kompatibel. Tujuan penulisan ulang ini adalah untuk menjaga perilaku "warisan" sebelum Chrome 80.Tulisan lengkap di blog Coder Frontline saya :
Ini harus berfungsi untuk sebagian besar aplikasi ASP .Net dan ASP .Net Core, meskipun Kerangka yang lebih baru memiliki opsi kode dan konfigurasi yang tepat untuk memungkinkan Anda mengontrol perilaku ini. Saya akan merekomendasikan meneliti semua opsi yang tersedia untuk Anda sebelum menggunakan penulisan ulang saya di atas.
sumber