ASP.NET网络表单从另一个域获取发布的数据时丢失会话

问题描述 投票:0回答:1

简单地:

  1. 在网站中,用户登录并创建一些会话对象。

  2. 网站A使用Response.Redirect将用户重定向到网站B中的页面。

  3. 网站B使用提交按钮将表单集合发布到网站A上的页面。

  4. 在此特定点上,此特定用户的所有会话均丢失,Session_Start再次触发。

本地主机和生产域都相同。

当两个页面都在同一个域上时,这是确定的,两个单独的域会出现问题。

在步骤3上,使用链接而不是按钮返回网站A(显然是wieemsh完全限定域名)时,一切正常,并且存在会话。

似乎是跨平台提交/发布问题。

会话是带有Cookie的InProc,不能更改此设置。

感谢您的关注。

P.S。对此进行了谷歌搜索,发现从页面重定向到另一页面时,存在某种类似的“丢失会话”问题。这不是响应引起的。重定向。

编辑

此问题很可能是由SameSite Cookie策略引起的。我在几种条件下进行了几次测试,但仍然无法确认。

asp.net session webforms http-post cross-domain
1个回答
0
投票

首先,这是一个4.7.1 ASP.NET Webform项目,因此,如果您使用的是MVC,则只能获得一些线索。

正如@ JohnPete22提到的This Article所说,SameSite Cookie策略(作为一种新的安全措施)适用于4.7.2及更高版本,在其中您可以控制至少打开或关闭它,但是没有什么控制权就是说它也影响4.7.1项目,并且没有对该功能的控制,确切地说,它始终为ON,但是.NET Framework版本无法识别控制命令(我不知道对.NET的任何更新。解决这个问题)。这就是为什么在单独的域上发回页面会丢失表单收集数据:以维护跨域安全性的原因。

注意:这不是解决方案,而是一种解决方法:

  1. 将您的项目更新为4.7.2以启用SameSite模式,这没什么大不了。

  2. 将此代码添加到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.StrictSameSiteMode.Lax,但是没有用,所以我只是关闭了此功能。

  3. 将其添加到Web.Config System.Web部分:

    <sessionState mode="InProc" cookieless="UseCookies" />
    
  4. 为了加强安全性,您可以考虑使用Request.UrlReferrer?.ToString()检查源网站,并相应地更改SameSite模式。

就这些,伙计们!。>>

© www.soinside.com 2019 - 2024. All rights reserved.