Ну, у меня есть 2 ASP. NET веб-сайта WebForm, работающие на одном и том же сервере windows, назовем их сайтом A и B. Есть несколько страниц на сайте A, на которых есть iFrame, указывающий на сайт B. Я хочу, чтобы мои пользователи проходили аутентификацию на сайте B, когда они просматривали сайт B через сайт A (через iFrames). Чтобы сделать это, источник моего iFrame на моем сайте A выглядит так:
B.com/index.aspx?guid={aGuid}&pageIWant={pageIWant}
Итак, я не буду go детализировать там, потому что это работает, и это не проблема, но как это работает в основном, это то, что в Page_Load index.aspx.vb моего сайта B я получаю указатель в строках запроса, представляющий пользователя, я получаю этого пользователя из базы данных, я регистрирую этого пользователя с помощью форм аутентификации, а затем я перенаправляю пользователя к «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
Страница index.aspx сайта B не требует аутентификации, но страница "documents.aspx" делает это. Надеюсь, я аутентифицировал своего пользователя на странице загрузки index.aspx, поэтому я go через Application_AuthenticateRequest в Global.asax.vb и все в порядке, мой пользователь может получить доступ к странице. Вот код в моем 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.SetAuthCook ie (user.Login, True)
Вот проблема: поскольку я установил на свой сервер windows (хостинг веб-сайтов) два следующих КБ:
- https://support.microsoft.com/en-us/help/4534978/kb4534978
- https://support.microsoft.com/en-us/help/4535104/kb4535104
Request.IsAuthenticated все еще false когда я перенаправляю на страницу "documents.aspx", несмотря на тот факт, что я вызываю FormsAuthentication.SetAuthCook ie до ... и исключение не выдается! Мой пользователь больше не вошел в систему.
Я удалил два КБ, и проблема больше не возникает, поэтому я уверен, что что-то с одним из этих двух КБ вызывает мою проблему.
Что-то действительно странное в том, что когда я пытаюсь воспроизвести проблему на локальном хосте, я вообще не сталкиваюсь с этой проблемой -> проблема возникает только тогда, когда у сайта A и сайта B нет одинакового доменного имени. Я сделал несколько проверок этой гипотезы, и она кажется верной.
Итак, что-то не так с фреймворком (или как я его использую), и из-за этого FormsAuthentication не работает должным образом через iFrame, когда источник iFrame не имеет того же доменного имени, что и контейнер iFrame, и когда эти два КБ установлены на сервере windows, на котором размещен веб-сайт. Это глупо, и я не могу найти проблема при отладке.
Обратите внимание, что в обоих случаях, работает ли аутентификация или нет, мой auth cook ie создается успешно ...
Может кто-нибудь иметь представление о том, что там происходит ? Не стесняйтесь задавать любые вопросы, если моя проблема не ясна.
С уважением