简单地:
在网站中,用户登录并创建一些会话对象。
网站A使用Response.Redirect将用户重定向到网站B中的页面。
网站B使用提交按钮将表单集合发布到网站A上的页面。
在此特定点上,此特定用户的所有会话均丢失,Session_Start再次触发。
本地主机和生产域都相同。
当两个页面都在同一个域上时,这是确定的,两个单独的域会出现问题。
在步骤3上,使用链接而不是按钮返回网站A(显然是wieemsh完全限定域名)时,一切正常,并且存在会话。
似乎是跨平台提交/发布问题。
会话是带有Cookie的InProc,不能更改此设置。
感谢您的关注。
P.S。对此进行了谷歌搜索,发现从页面重定向到另一页面时,存在某种类似的“丢失会话”问题。这不是响应引起的。重定向。
编辑
此问题很可能是由SameSite Cookie策略引起的。我在几种条件下进行了几次测试,但仍然无法确认。
首先,这是一个4.7.1 ASP.NET Webform项目,因此,如果您使用的是MVC,则只能获得一些线索。
正如@ JohnPete22提到的This Article所说,SameSite Cookie策略(作为一种新的安全措施)适用于4.7.2及更高版本,在其中您可以控制至少打开或关闭它,但是没有什么控制权就是说它也影响4.7.1项目,并且没有对该功能的控制,确切地说,它始终为ON,但是.NET Framework版本无法识别控制命令(我不知道对.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
和SameSiteMode.Lax
,但是没有用,所以我只是关闭了此功能。
将其添加到Web.Config System.Web部分:
<sessionState mode="InProc" cookieless="UseCookies" />
为了加强安全性,您可以考虑使用Request.UrlReferrer?.ToString()
检查源网站,并相应地更改SameSite模式。
就这些,伙计们!。>>