ब्राउज़र हमारी साइट पर भुगतान गेटवे के पोस्ट अनुरोध पर ASP.NET_SessionId कुकी सेट नहीं करेगा


12

हम अपने वेब एप्लिकेशन की भुगतान प्रक्रिया के साथ एक अजीब समस्या का सामना कर रहे हैं जिसके परिणामस्वरूप सत्र डेटा का नुकसान होता है।

इस प्रक्रिया में, हमारे चेक-आउट पृष्ठ के बाद उपयोगकर्ता भुगतान प्रदाता के पृष्ठ पर पुनर्निर्देशित हो जाता है और जैसे ही s / वह वहां किया जाता है, हमारी साइट पर वापस भेज दिया जाता है। यह अंतिम पुनर्निर्देशन ब्राउज़र के भुगतान प्रदाता के HTML कोड के मूल्यांकन द्वारा किया जाता है, जो मूल रूप से हमारी साइट पर आने वाले पोस्ट और जावास्क्रिप्ट कोड की कुछ पंक्तियों के साथ होता है जो पेज लोड होने पर पोस्ट करते हैं। इस बिंदु पर ब्राउज़र पोस्ट अनुरोध करता है, लेकिन "ASP.NET_SessionId" कुकी को सेट नहीं करता है, जो सटीक उसी डोमेन (हमारे एप्लिकेशन के डोमेन) में किए गए पिछले अनुरोधों में मौजूद है। क्या अधिक अजीब है कि यह एक और कुकी सेट करता है जिसे हम "AcceptCookie" नाम से उपयोग करते हैं। यह सिर्फ "ASP.NET_SessionId" कुकी को छोड़ने का विकल्प चुनता है।

स्थिति को स्पष्ट करने के लिए मैंने कुछ स्क्रीनशॉट लिए। (इन स्क्रीनशॉट्स में नारंगी और हरे रंग के आयतों में बिलकुल समान मूल्य होता है।)

  1. यह वह अनुरोध है जो कि (हमारे आवेदन के लिए) है जब उपयोगकर्ता "चेक आउट" बटन दबाता है। इस अनुरोध के बाद उपयोगकर्ता भुगतान प्रदाता के पेज पर पुनर्निर्देशित हो जाता है।

चेक-आउट अनुरोध

  1. यह अंतिम पृष्ठ है जो उपयोगकर्ता द्वारा किए जाने के बाद भुगतान प्रदाता द्वारा दिया जाता है। जैसा कि आप देख सकते हैं कि यह केवल एक सरल रूप है जो स्वचालित रूप से पृष्ठ लोड पर हमारे डोमेन पर पोस्ट किया गया है।

भुगतान प्रदाता की अंतिम प्रतिक्रिया

  1. लेकिन इस पोस्ट अनुरोध में "ASP.NET_SessionId" कुकी शामिल नहीं है, जिसके परिणामस्वरूप एक नया सत्र आईडी प्राप्त करने और पिछले सत्र के डेटा का नुकसान होता है। और फिर, बस "ASP.NET_SessionId" गायब है, दूसरे का नाम "AcceptCookie" नहीं है।

पोस्ट अनुरोध जो उपयोगकर्ता को हमारी साइट पर वापस लाता है (पिछले चरण में जावास्क्रिप्ट के साथ बनाया गया)

अंत में हमें लगा कि ब्राउज़र के पुराने संस्करणों पर यह समस्या नहीं आती है। फ़ायरफ़ॉक्स 52 पर यह एक आकर्षण की तरह काम करता है लेकिन फ़ायरफ़ॉक्स 71 पर उपरोक्त समस्या होती है।

कोई विचार?

नोट: यह एक ASP.NET MVC लक्ष्य-निर्धारण के साथ अनुप्रयोग है = "4.5.2"

आपका दिन शुभ हो।

जवाबों:


16

हमने इसका पता लगा लिया।

किसी तरह "ASP.NET_SessionId" कुकी का "समान" विशेषता "लैक" को डिफॉल्ट करता है और इसके कारण सत्र कुकी को भुगतान गेटवे के जावास्क्रिप्ट कोड द्वारा किए गए अनुरोध में नहीं जोड़ा जाता है।

हमने इस मान को ओवरराइड करने के लिए 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>

अद्यतन १ : बस ऊपर दिए गए कॉन्फ़िगरेशन को जोड़ने से आधुनिक ब्राउज़रों के लिए समस्या हल हो गई, लेकिन हमने महसूस किया कि हम अभी भी पुराने संस्करणों के साथ माइक्रोसाफ्ट एज और इंटरनेट एक्सप्लोरर के साथ समस्या थे।

इसलिए हमें web.config फ़ाइल में नोड को जोड़ने के लिए CookieSameSite = "none" विशेषता जोड़ने की आवश्यकता थी।

<sessionState cookieSameSite="None" />

इस कॉन्फ़िगरेशन परिवर्तन से सावधान रहें, क्योंकि पुराने .net फ्रेमवर्क संस्करण इसका समर्थन नहीं करते हैं और आपकी साइट को त्रुटि पृष्ठ प्रदर्शित करने का कारण बनते हैं।

वैसे हम अभी भी IOS 12 में ब्राउज़रों के साथ समस्या कर रहे हैं। लेकिन मुझे लगता है कि यह इस पुष्ट बग से संबंधित है

अद्यतन 2 : IOS मुद्दे के बारे में संभावित सुधार के लिए zemien का उत्तर देखें

अद्यतन 3 : ज़ेमिएन के उत्तर में सुझावों के साथ हमारे निष्कर्षों को जोड़कर हम निम्नलिखित लिखित नियमों के साथ आए हैं। हम उत्पादन में इस विन्यास का उपयोग कर रहे हैं। लेकिन सावधान रहें: यह संगत ब्राउज़रों के लिए "समान: कोई नहीं" विशेषता के साथ सभी कुकीज़ को चिह्नित करता है और असंगत ब्राउज़रों के लिए मौजूद समसाइट विशेषता को बाहर करता है। यह जटिल लग सकता है लेकिन मैंने टिप्पणी लाइनों के माध्यम से समझाने की कोशिश की।

यह अंतिम विन्यास है जिसका हम उत्पादन में उपयोग करते हैं:

<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>

धन्यवाद @ EÖzgür। यह समस्या KB4533097 ( support.microsoft.com/en-us/help/4533097/kb4533097 ) से आती है, विशेष रूप से KB4533011 (.net 4.7 और उससे कम) और KB4533004 (.net 4.8) को डीईएल 10 पर जारी किया गया है।
पिन्यू

मेरे पास एक ही समस्या है, लेकिन कभी-कभी asp.net mvc ग्राहक को ASP.NET_SessionId कुकीज़ कभी-कभी लोन के साथ दे देता है। मुझे यकीन नहीं है कि यह क्यों खुश है। मेरा मतलब है कि यह हर समय ढीला होना चाहिए, लेकिन फिर भी जब मैं साइट पर लॉगिन करता हूं तो मुझे कोई नहीं मिल सकता है।
ड्यूक

ओह यार! मैं दो दिनों से इस मुद्दे पर पागल हूं। अंत में आपके जवाब से मेरा दिन और निराशा बच गई। धन्यवाद।
हेमंत

1
दिसंबर अपडेट्स लागू करने के बाद हमें यह समस्या सर्वर 2016 में हुई थी। (KB4530689)। समाधान खोजने के लिए बहुत धन्यवाद!
user0474975

क्या यह केवल डॉटनेट कोर के लिए है? मेरे फ्रेमवर्क एप्लिकेशन में मैं आपके विकल्पों को सेट करने के लिए अमान्य मानों के रूप में दिखा रहा हूं।
आयरनसैन

3

मैंने इस URL को फिर से लिखने के लिए कई SO उत्तरों को संशोधित किया है जो SameSite=Noneसत्र कुकीज़ को जोड़ता है, और सभीSameSite=None से हटा भी देता है अधिकांश असंगत ब्राउज़रों के लिए कुकीज़ है। इस पुनर्लेखन का उद्देश्य "विरासत" व्यवहार प्री-क्रोम 80 को संरक्षित करना है।

मेरे कोडर फ्रंटलाइन ब्लॉग में पूरा लेखन :

<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)(=.*))(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 कोर अनुप्रयोगों के लिए काम करना चाहिए, हालाँकि नए फ्रेमवर्क में उचित कोड और कॉन्फिगर विकल्प हैं जिससे आप इस व्यवहार को नियंत्रित कर सकते हैं। मैं ऊपर मेरे पुनर्लेखन का उपयोग करने से पहले आपके लिए उपलब्ध सभी विकल्पों पर शोध करने की सलाह दूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.