ASP.NET webform 在从另一个域获取发布数据时丢失会话
ASP.NET webform loses session when getting posted data from another domain
简单:
在网站中 用户登录并创建一些会话对象。
网站 A 使用 Response.Redirect 将用户重定向到网站 B 中的页面。
网站 B 使用提交按钮将表单集合发布到网站 A 的页面。
在这个特定点上,这个特定用户的所有会话都丢失并且 Session_Start 再次触发。
本地主机域和生产域都一样。
当两个页面都在同一个域时,这没问题,但两个单独的域就会出现问题。
在第 3 步中,当使用 link 而不是 return 按钮访问网站 A(显然是 wieemsh 完全合格的域名)时,一切正常并且存在会话。
这似乎是一个跨平台问题 submit/POST。
会话是带有 cookie 的 InProc,无法更改此设置。
感谢您的关注。
P.S。谷歌搜索这个,我发现从一个页面重定向到另一个页面时存在某种类似的 'losing session' 问题。这不是由 response.Redirect.
引起的
编辑
这个问题有可能是SameSite Cookie Policy引起的。我 运行 在几个条件下进行了几次测试,但我仍然无法确认这一点。
首先这是一个 4.7.1 ASP.NET webform 项目,所以如果您使用 MVC,您只能得到一些线索。
正如@JohnPete22 提到的那样 This Article 说 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
和 SameSiteMode.Lax
但没有用,所以我干脆关闭了该功能。
将此添加到 Web.Config System.Web 部分:
<sessionState mode="InProc" cookieless="UseCookies" />
为了加强安全性,您可以考虑使用 Request.UrlReferrer?.ToString()
检查源网站并相应地更改 SameSite 模式。
就这些了,伙计们!
简单:
在网站中 用户登录并创建一些会话对象。
网站 A 使用 Response.Redirect 将用户重定向到网站 B 中的页面。
网站 B 使用提交按钮将表单集合发布到网站 A 的页面。
在这个特定点上,这个特定用户的所有会话都丢失并且 Session_Start 再次触发。
本地主机域和生产域都一样。
当两个页面都在同一个域时,这没问题,但两个单独的域就会出现问题。
在第 3 步中,当使用 link 而不是 return 按钮访问网站 A(显然是 wieemsh 完全合格的域名)时,一切正常并且存在会话。
这似乎是一个跨平台问题 submit/POST。
会话是带有 cookie 的 InProc,无法更改此设置。
感谢您的关注。
P.S。谷歌搜索这个,我发现从一个页面重定向到另一个页面时存在某种类似的 'losing session' 问题。这不是由 response.Redirect.
引起的编辑
这个问题有可能是SameSite Cookie Policy引起的。我 运行 在几个条件下进行了几次测试,但我仍然无法确认这一点。
首先这是一个 4.7.1 ASP.NET webform 项目,所以如果您使用 MVC,您只能得到一些线索。
正如@JohnPete22 提到的那样 This Article 说 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
和SameSiteMode.Lax
但没有用,所以我干脆关闭了该功能。将此添加到 Web.Config System.Web 部分:
<sessionState mode="InProc" cookieless="UseCookies" />
为了加强安全性,您可以考虑使用
Request.UrlReferrer?.ToString()
检查源网站并相应地更改 SameSite 模式。
就这些了,伙计们!