Wir haben es herausgefunden.
Irgendwie ist das Attribut "SameSite" des Cookies "ASP.NET_SessionId" standardmäßig "Lax", und dies führt dazu, dass der Anforderung, die vom Javascript-Code des Zahlungsgateways gestellt wird, kein Sitzungscookie hinzugefügt wird.
Wir haben der Datei web.config die folgende Regel hinzugefügt, um diesen Wert zu überschreiben und auf "Keine" zu setzen.
<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>
UPDATE 1 : Nur das Hinzufügen der obigen Konfiguration löste das Problem für moderne Browser, aber wir stellten fest, dass wir immer noch Probleme mit älteren Versionen von Micosoft Edge und Internet Explorer hatten.
Daher mussten wir dem sessionState-Knoten in der Datei web.config das Attribut cookieSameSite = "None" hinzufügen.
<sessionState cookieSameSite="None" />
Seien Sie jedoch vorsichtig mit dieser Konfigurationsänderung, da ältere .net Framework-Versionen diese nicht unterstützen und auf Ihrer Site eine Fehlerseite angezeigt wird.
Übrigens haben wir immer noch Probleme mit Browsern in IOS 12. Aber ich denke, es hängt mit diesem bestätigten Fehler zusammen
UPDATE 2 : In der Antwort von zemien finden Sie mögliche Lösungen für das IOS-Problem
UPDATE 3 : Indem wir unsere Ergebnisse mit den Vorschlägen in Zemiens Antwort kombinieren, haben wir die folgenden Umschreiberegeln entwickelt. Wir haben diese Konfiguration in der Produktion verwendet. Aber Vorsicht: Es markiert alle Cookies mit dem Attribut "SameSite: None" für kompatible Browser und schließt das SameSite-Attribut, falls vorhanden, für inkompatible Browser aus. Es mag kompliziert erscheinen, aber ich habe versucht, es über Kommentarzeilen zu erklären.
Dies ist die endgültige Konfiguration, die wir in der Produktion verwenden:
<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>
Ich habe mehrere SO-Antworten geändert, um diese URL-Neufassung zu erhalten, die
SameSite=None
Sitzungscookies hinzufügt , und sie für die meisten inkompatiblen BrowserSameSite=None
aus allen Cookies zu entfernen . Ziel dieser Neufassung ist es, das "Legacy" -Verhalten vor Chrome 80 beizubehalten.Vollständiger Artikel in meinem Coder Frontline-Blog :
Dies sollte für die meisten ASP .Net- und ASP .Net Core-Anwendungen funktionieren, obwohl neuere Frameworks über geeignete Code- und Konfigurationsoptionen verfügen, mit denen Sie dieses Verhalten steuern können. Ich würde empfehlen, alle verfügbaren Optionen zu prüfen, bevor Sie mein oben beschriebenes Umschreiben verwenden.
quelle