Simply:
在网站中,用户登录并创建一些会话对象。
网站 A 使用 Response.Redirect 将用户重定向到网站 B 中的页面。
网站 B 使用提交按钮将表单集合发布到网站 A 上的页面。
在此特定点上,该特定用户的所有会话都会丢失,并且 Session_Start 再次触发。
这对于本地主机和生产域都是相同的。
当两个页面位于同一域时这是可以的,两个单独的域就会出现问题。
在步骤 3 中,当使用链接而不是按钮返回网站 A(显然是 wieemsh 完全限定域名)时,一切正常并且会话存在。
似乎这是一个跨平台提交/POST 问题。
会话是带有 cookie 的 InProc,无法更改此设置。
感谢您的关注。
附:谷歌搜索这个,我发现从一个页面重定向到另一个页面时存在某种类似的“丢失会话”问题。这不是由response.Redirect引起的。
Edit
此问题很可能是由 SameSite Cookie 策略引起的。我在几种条件下进行了多次测试,但我仍然无法确认这一点。
首先这是一个 4.7.1 ASP.NET Webform 项目,所以如果您使用 MVC,您只能得到一些线索。
正如@JohnPete22提到的本文 https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/说 SameSite Cookie 策略(作为一项新的安全措施)适用于 4.7.2 及更高版本,您至少可以控制打开或关闭它,但它没有说它也会影响 4.7.1项目以及对该功能没有控制,准确地说,它始终处于开启状态,但 .NET 框架版本无法识别控制命令(我不知道有任何 .NET 更新可以解决此问题)。这就是为什么回发到单独域上的页面会丢失表单收集数据的原因:以维护跨域安全性。
注意:这不是解决方案,而是解决方法:
将您的项目更新到 4.7.2 以启用 SameSite 模式,这没什么大不了的。
-
将此代码添加到 Global.asax Session_Start 事件中
if (Response.Cookies["ASP.NET_SessionId"] != null)
{
Response.Cookies["ASP.NET_SessionId"].SameSite = SameSiteMode.None;
// Optional - This makes the feature secure
// if (Request.IsSecureConnection)
// Response.Cookies["ASP.NET_SessionId"].Secure = true;
}
我测试了其他选项SameSiteMode.Strict
and SameSiteMode.Lax
但没有用,所以我干脆关闭了该功能。
-
将其添加到 Web.Config System.Web 部分:
<sessionState mode="InProc" cookieless="UseCookies" />
为了加强安全性,您可以考虑使用以下命令检查源网站Request.UrlReferrer?.ToString()
并相应地更改 SameSite 模式。
这就是全部,伙计们!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)