繁体   English   中英

从第三方 API(支付网关)重定向后丢失 session 数据

[英]Losing session data after redirecting from a 3rd party API (payment gateway)

我正在开发一个建立在ASP.NET MVC之上的电子商务网站。 我们使用第三方支付网关进行在线支付交易。 基本上,我使用successUrlfailUrl将用户重定向到支付网关。 如果一切顺利,支付网关会将用户重定向到我的successUrl

我面临的问题是,一旦用户被重定向到我的 successUrl ,我就会丢失所有successUrl数据。 因此,我无法跟踪此用户,也无法进一步处理该订单。 更多细节:

  1. 我正在使用InProc SessionState
  2. 我在 SessionState 中定义了timeout ,但这没有帮助
  3. 我还在Global.asax文件的Session_Start方法中定义Session.Timeout
  4. 目前我的应用程序使用http ,支付网关使用https
  5. 支付网关建立在PHP

我试过的:

我创建了一个虚拟 API 然后从我的电子商务应用程序向它发送请求,然后将其重定向到我的电子商务应用程序。 在这种情况下,我不会丢失 session 数据。 所以,我不确定这里出了什么问题。

我知道有解决方法,但我更想知道为什么我会丢失 session 数据。 幕后到底发生了什么? 我该怎么做才能解决这个问题? 如果你能详细说明,那真的很有帮助。

更新

我刚刚在 Firefox(版本 76.x)中测试了我的解决方案并且我的解决方案有效。! 但它不适用于 chrome(版本 75.x)

您需要将此代码添加到 Global.asax Session_Start事件

if (Response.Cookies["ASP.NET_SessionId"] != null)
{
    Response.Cookies["ASP.NET_SessionId"].SameSite = SameSiteMode.None;
}

有关详细信息,请参阅文档。

我不知道这是否是您的问题,但今年我们在支付网关中遇到了同样的问题,我们意识到问题来自Chrome 的 SameSite 问题 向 web.config 添加一些参数为我们解决了这个问题。

对于 .NET 4.7.2 及以上使用

<configuration>
 <system.web>  
  <sessionState cookieSameSite="None" /> 
 <system.web>
<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" />
            <add input="{HTTP_USER_AGENT}" pattern="\(iP.*; CPU .*OS 12" negate="true" />
            <add input="{HTTP_USER_AGENT}" pattern="Macintosh; Intel Mac OS X 10_14.*Safari" negate="true" /> 
          </preCondition>
        </preConditions>
      </outboundRules>
   </rewrite>
</system.webServer>

在花了一整天时间并在 SO 和其他地方阅读了大量文章之后,我就是这样做的:

第 1 步:将目标框架更改为 4.7.2(之前是 4.5.2)

第 2 步:将以下两行添加到 web.config 文件中的 system.web 部分:

    <sessionState cookieSameSite="None" />
    <httpCookies httpOnlyCookies="true" requireSSL="true"/>

这就是让它继续下去所需要的一切。 现在它可以在 Chrome 和 Firefox 中运行(尚未在其他浏览器上进行测试,但希望它也可以在其他浏览器上运行)。

附言:

  • 我知道我通过将 cookieSameSite 设置为“无”而在整体安全性方面做出了妥协,但接下来肯定会采取措施解决这个问题。

  • 我被这个问题淹没了,然后在解决之后我感到非常高兴,这让我在 SO 写下了我的第一个答案。 所以,如果你这样做,请在评论时保持温和。

谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM