เราคิดออก
อย่างใดอย่างหนึ่ง "ASP.NET_SessionId" แอตทริบิวต์ของคุกกี้ "SameSite" เริ่มต้นที่ "หละหลวม" และสิ่งนี้ทำให้คุกกี้เซสชั่นไม่ได้ถูกเพิ่มลงในคำขอที่ทำโดยรหัสจาวาสคริปต์ของเกตเวย์การชำระเงิน
เราได้เพิ่มกฎต่อไปนี้ลงในไฟล์ 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 = "ไม่มี" แอตทริบิวต์ไปยังโหนด sessionState ในไฟล์ web.config
<sessionState cookieSameSite="None" />
โปรดใช้ความระมัดระวังกับการเปลี่ยนแปลงการกำหนดค่านี้เนื่องจากรุ่นกรอบงาน. net รุ่นเก่าไม่รองรับและทำให้เว็บไซต์ของคุณแสดงหน้าข้อผิดพลาด
โดยวิธีที่เรายังคงมีปัญหากับเบราว์เซอร์ใน IOS 12 แต่ฉันคิดว่ามันเกี่ยวข้องกับข้อผิดพลาดที่ยืนยันนี้
ปรับปรุง 2 : ดูคำตอบของเซมินสำหรับการแก้ไขที่เป็นไปได้เกี่ยวกับปัญหา IOS
อัปเดต 3 : โดยการรวมสิ่งที่ค้นพบกับคำแนะนำในคำตอบของเซมินเราได้ทำตามกฎการเขียนซ้ำต่อไปนี้ เราใช้การกำหนดค่านี้ในการผลิต แต่ระวัง: มันจะทำเครื่องหมายคุกกี้ทั้งหมดด้วยแอตทริบิวต์ "SameSite: None" สำหรับเบราว์เซอร์ที่เข้ากันได้และไม่รวมแอตทริบิวต์ SameSite หากมีอยู่สำหรับเบราว์เซอร์ที่เข้ากันไม่ได้ มันอาจดูซับซ้อน แต่ฉันพยายามอธิบายผ่านบรรทัดความคิดเห็น
นี่คือการกำหนดค่า FINAL ที่เราใช้ในการผลิต:
<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>