[英]Losing session data after redirecting from a 3rd party API (payment gateway)
我正在开发一个建立在ASP.NET MVC
之上的电子商务网站。 我们使用第三方支付网关进行在线支付交易。 基本上,我使用successUrl
和failUrl
将用户重定向到支付网关。 如果一切顺利,支付网关会将用户重定向到我的successUrl
。
我面临的问题是,一旦用户被重定向到我的 successUrl ,我就会丢失所有successUrl
数据。 因此,我无法跟踪此用户,也无法进一步处理该订单。 更多细节:
InProc
SessionStatetimeout
,但这没有帮助Global.asax
文件的Session_Start
方法中定义Session.Timeout
http
,支付网关使用https
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.