我们在 Web 应用程序的支付过程中遇到了一个奇怪的问题,导致会话数据丢失。
在这个过程中,在我们的结帐页面用户被重定向到支付提供商的页面后,只要他/她在那里完成,就会被重定向回我们的网站(到我们指定的网址)。最后一个重定向是通过浏览器对支付提供商的 html 代码的评估完成的,该代码基本上由一个发布到我们网站的表单和几行在页面加载时发布该表单的 javascript 代码组成。此时浏览器发出 post 请求,但没有设置“ASP.NET_SessionId”cookie,该 cookie 存在于先前对完全相同的域(我们的应用程序的域)发出的请求中。更奇怪的是,它设置了我们使用的另一个名为“AcceptCookie”的 cookie。它只是简单地选择删除“ASP.NET_SessionId”cookie。
为了说明这种情况,我截取了一些屏幕截图。(在这些屏幕截图中,橙色和绿色矩形包含完全相同的值。)
将用户带回我们网站的发布请求(在上一步中使用 javascript 制作)
最后我们认为在旧版本的浏览器上不会出现这个问题。在 Firefox 52 上它就像一个魅力,但在 Firefox 71 上会发生上述问题。
有任何想法吗?
注意:这是一个 ASP.NET MVC 应用程序,其 targetFramework="4.5.2"
祝你今天过得愉快。
我使用 asp.net MVC 开发了一个网站
我们确实对站点进行了扫描,它给出了一个 CSRF,要求将站点 cookie 设置为同一站点。在 web.config 中尝试了下面的代码,但似乎它只能从 4.7.1 开始工作 -
我们有什么办法可以在 .Net 4.6 中实现这一点,非常需要帮助:)
<httpCookies cookieSameSite="None" />
Run Code Online (Sandbox Code Playgroud)
<rewrite>
<outboundRules>
<rule name="Add SameSite" preCondition="No SameSite">
<match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
<action type="Rewrite" value="{R:0}; SameSite=strict" />
<conditions>
</conditions>
</rule>
<preConditions>
<preCondition name="No SameSite">
<add input="{RESPONSE_Set_Cookie}" pattern="." />
<add input="{RESPONSE_Set_Cookie}" pattern="; SameSite=strict" negate="true" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
Run Code Online (Sandbox Code Playgroud) // 在使用第三方网关托管表单之前创建会话
public function ezi_test() {
if (isset($_SESSION['form_data'])) {
unset($_SESSION['form_data']);
}
$this->common->maintain_log(array('collection_type'=>3,'org_id'=>'','log_path'=>'gateway_log/ezidebit/hosted_payment_formdata_creation_bef','log_data'=>json_encode($_REQUEST)));
parse_str($_REQUEST['data1'], $_REQUEST);
$_SESSION['paynow']['tnc']['email_id'] = isset($_REQUEST['email_id']) ? $_REQUEST['email_id'] : '';
$this->common->maintain_log(array('collection_type'=>3,'org_id'=>'','log_path'=>'gateway_log/ezidebit/hosted_payment_formdata_creation','log_data'=>json_encode($_REQUEST)));
$_SESSION['form_data'] = $_REQUEST
}
Run Code Online (Sandbox Code Playgroud)
// 在第三方回调上检索会话 public function ezi_hosted_payment() {
if (isset($_SESSION['ezi_hosted'])) {
unset($_SESSION['ezi_hosted']);
}
if (isset($_SESSION['form_data'])) {
$form_data = $_SESSION['form_data'];
unset($_SESSION['form_data']);
}
$this->common->maintain_log(array('collection_type'=>3,'org_id'=>'','log_path'=>'gateway_log/ezidebit/hosted_payment_log','log_data'=>json_encode($_REQUEST)));
$this->common->maintain_log(array('collection_type'=>3,'org_id'=>'','log_path'=>'gateway_log/ezidebit/hosted_payment_formdata','log_data'=>json_encode($form_data)));
$final = array_merge($_REQUEST, $form_data);
$_SESSION['pg_response'] = $_REQUEST;
$this->ezi_gateway_paynow_sub($final);
}
Run Code Online (Sandbox Code Playgroud) 为了避免 CSRF(跨站点请求伪造),大多数浏览器(自 2019 年末以来)自动考虑任何未明确定义 SameSite 属性的 cookie 将被视为 Lax,而不是之前的默认值 None。
最近(2020 年 2 月,自 Chrome 80 起)浏览器也忽略了定义 SameSite=None 且不安全的 cookie。
如何在我的 Web.config 中更改我的会话 cookie 以自动更改为无(以保持我的 SSO 集成工作)?