ASP.NET 跨域 iFrame 的 WebForms FormsAuthentication 问题

ASP.NET WebForms FormsAuthentication problem with cross-domain iFrames

嗯,我有 2 个 ASP.NET WebForm 网站,运行 在同一台 windows 服务器机器上生产,我们称它们为站点 A 和站点 B。有些页面在网站 A,其中有一个 iFrame,指向网站 B。我希望我的用户在通过网站 A(通过 iFrame)浏览网站 B 时在网站 B 上进行身份验证。为了做到这一点,我的网站 A 上的 iFrame 源是这样的:

B.com/index.aspx?guid={aGuid}&pageIWant={pageIWant}

所以,我不会在那里详细介绍,因为它有效并且不是问题,但它的工作原理基本上是 Page_Load index.aspx.vb 我的站点 B,我在代表用户的查询字符串中获取 guid,我从数据库中获取该用户,我使用表单身份验证记录该用户,然后我将用户重定向到 "pageIWant",另一个查询字符串范围。所以,这就是我在 page_load 中所做的,基本上:

/*Get the guid*/
Dim user = /*get user from guid*/
/*some checks*/
FormsAuthentication.SetAuthCookie(user.Login, True)
Select Case Request.QueryString("pageIWant")
                            Case "1"
                                Response.Redirect("documents.aspx")
                            Case "2"
                                /*etc*/
                        End Select

站点B的index.aspx页面不需要认证,但是"documents.aspx"页面需要。希望我确实在 index.aspx 的页面加载中验证了我的用户,所以我在 Global.asax.vb[ 中通过 Application_AuthenticateRequest 一切正常,我的用户可以访问该页面。这是我的 Application_AuthenticateRequest 方法中的代码:

    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
    If Request.IsAuthenticated Then
        If Request.Cookies("ESERVICES_LOGIN") IsNot Nothing Then
            Dim aTicket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(Request.Cookies("ESERVICES_LOGIN").Value)
            HttpContext.Current.User = New GenericPrincipal(New GenericIdentity(aTicket.Name), aTicket.UserData.Split(","c))
        Else
            FormsAuthentication.SignOut()
            HttpContext.Current.User = New GenericPrincipal(New GenericIdentity(String.Empty, String.Empty), New String() {})
            Response.Clear()
        End If
    End If
End Sub

在这种情况下,当我重定向到页面 "documents.aspx" 时,Request.IsAuthenticated 设置为 true,因为我之前调用了 FormsAuthentication.SetAuthCookie(user.Login, 真)

这是问题所在:因为我在我的 windows 服务器计算机(托管网站)上安装了以下两个 KB:

  1. https://support.microsoft.com/en-us/help/4534978/kb4534978
  2. https://support.microsoft.com/en-us/help/4535104/kb4535104
当我重定向到 "documents.aspx" 页面时,

Request.IsAuthenticated 仍然是 false,尽管我之前调用了 FormsAuthentication.SetAuthCookie...也不例外!我的用户不再登录了。

我卸载了这两个 KB,问题不再出现,所以我确信这两个 KB 之一是导致我出现问题的原因。

真正奇怪的是,当我尝试在localhost 中重现该问题时,我根本没有遇到该问题-> 问题似乎只有在网站A 和网站B 的域名不同时才会出现。我已经对这个假设进行了多次测试,它似乎是正确的。

所以,框架有问题(或者我如何使用它),因此,当 iFrame 源不具有相同的域时,FormsAuthentication 无法通过 iFrame 正常工作名称作为 iFrame 容器,当这两个 KB 安装在托管网站的 windows 服务器计算机上时。 这很愚蠢,我在调试时找不到问题。

请注意,在这两种情况下,无论身份验证是否有效,我的身份验证 cookie 都已成功创建...

有人知道那里发生了什么吗?如果我的问题不清楚,请随时提问。

此致

我找到了解释。

自 2019 年以来,Microsoft 发布了更改 cookie "SameSite" 属性默认值的知识库。以前,当使用 FormsAuthentication.SetAuthCookie 创建 auth cookie 时,没有指定 SameSite 属性,在大多数浏览器中,它的默认值为 "none" 并且工作正常。 (自 2020 年 2 月以来,Chrome 不再是这种情况,默认值变为 "lax")。

现在,使用我提到的知识库,默认值变为 "Strict",这就是我的身份验证不再适用于我的情况的原因。

因此,如果可能的话,我必须手动将我的身份验证 cookie 的 samesite 属性指定为 "None",并考虑我可能遇到的安全问题。作为最后的手段,我也可以为我的两个网站使用相同的域名。