我正在一个基于ASP.NET MVC
的电子商务网站上工作。我们正在使用第三方支付网关进行在线支付交易。基本上,我使用successUrl
和failUrl
将用户重定向到付款网关。如果一切正常,则支付网关会将用户重定向到我的successUrl
。
我面临的问题是,一旦用户重定向到我的successUrl
,我就会丢失所有会话数据。因此,我无法跟踪此用户,也无法进一步处理订单。详细信息:
InProc
SessionState timeout
,但这无济于事Session.Timeout
文件的Session_Start
方法中定义了Global.asax
http
,而支付网关使用https
PHP
之上我尝试过的事情:
我创建了一个虚拟API,然后从我的电子商务应用程序向其发送了一个请求,然后将其重定向到我的电子商务应用程序。在这种情况下,我不会丢失会话数据。所以,我不确定这是什么问题。
我知道可以解决这个问题,但是我更想知道为什么我丢失了会话数据。幕后到底发生了什么?我该怎么办才能解决这个问题?如果您能详细说明,那真的很有帮助。
更新
我刚刚在Firefox(版本76.x)中测试了我的解决方案和解决方案 作品!!但不适用于chrome(版本75.x)
答案 0 :(得分:1)
您需要将此代码添加到Global.asax Session_Start
事件
if (Response.Cookies["ASP.NET_SessionId"] != null)
{
Response.Cookies["ASP.NET_SessionId"].SameSite = SameSiteMode.None;
}
有关更多详细信息,请参阅this文档。
答案 1 :(得分:1)
我不知道这是否是您的问题,但是今年我们在支付网关中遇到了同样的问题,我们意识到问题出在SameSite issue of Chrome。在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>