【发布时间】: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:
- https://support.microsoft.com/en-us/help/4534978/kb4534978
- 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