【问题标题】:ASP.NET WebForms FormsAuthentication problem with cross-domain iFrames跨域 iFrame 的 ASP.NET WebForms FormsAuthentication 问题
【发布时间】:2020-06-29 07:28:38
【问题描述】:

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

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

所以,我不会在那里详细介绍,因为它可以工作并且不是问题,但它的工作原理基本上是在我的站点B的index.aspx.vb的Page_Load中,我在代表用户的查询字符串中获取 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, True)

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

  1. https://support.microsoft.com/en-us/help/4534978/kb4534978
  2. https://support.microsoft.com/en-us/help/4535104/kb4535104

Request.IsAuthenticated 仍然是 false 当我重定向到“documents.aspx”页面时,尽管我之前调用了 FormsAuthentication.SetAuthCookie ......并且没有抛出异常!我的用户没有登录了。

我卸载了这两个 KB,问题不再出现,所以我确定这两个 KB 中的一个有问题导致了我的问题。

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

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

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

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

问候

【问题讨论】:

    标签: asp.net iframe webforms forms-authentication windows-server-2012-r2


    【解决方案1】:

    我找到了解释。

    自 2019 年起,Microsoft 将发布 KB,以更改 cookie 的“SameSite”属性的默认值。之前,在使用 FormsAuthentication.SetAuthCookie 创建身份验证 cookie 时,未指定 SameSite 属性,并且在大多数浏览器中,它的默认值是“none”,它工作得很好。 (自 2020 年 2 月起,Chrome 不再是这种情况,默认值变为“lax”)。

    现在,对于我提到的 KB,默认值变为“严格”,这就是我的身份验证在我的情况下不再起作用的原因。

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

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 2012-12-11
      • 2011-02-18
      相关资源
      最近更新 更多