ASP. NET Проблема WebForms FormsAuthentication с междоменными iFrames - PullRequest
0 голосов
/ 18 марта 2020

Ну, у меня есть 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 (хостинг веб-сайтов) два следующих КБ:

  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.SetAuthCook ie до ... и исключение не выдается! Мой пользователь больше не вошел в систему.

Я удалил два КБ, и проблема больше не возникает, поэтому я уверен, что что-то с одним из этих двух КБ вызывает мою проблему.

Что-то действительно странное в том, что когда я пытаюсь воспроизвести проблему на локальном хосте, я вообще не сталкиваюсь с этой проблемой -> проблема возникает только тогда, когда у сайта A и сайта B нет одинакового доменного имени. Я сделал несколько проверок этой гипотезы, и она кажется верной.

Итак, что-то не так с фреймворком (или как я его использую), и из-за этого FormsAuthentication не работает должным образом через iFrame, когда источник iFrame не имеет того же доменного имени, что и контейнер iFrame, и когда эти два КБ установлены на сервере windows, на котором размещен веб-сайт. Это глупо, и я не могу найти проблема при отладке.

Обратите внимание, что в обоих случаях, работает ли аутентификация или нет, мой auth cook ie создается успешно ...

Может кто-нибудь иметь представление о том, что там происходит ? Не стесняйтесь задавать любые вопросы, если моя проблема не ясна.

С уважением

1 Ответ

0 голосов
/ 19 марта 2020

Я нашел объяснение.

С 2019 года Microsoft выпускает КБ, которые изменяют значение по умолчанию атрибута «SameSite» для файлов cookie. Раньше при создании auth cook ie с FormsAuthentication.SetAuthCook ie атрибут SameSite не указывался, и в большинстве браузеров его значением по умолчанию было «none», и оно работало просто отлично. (это не относится к Chrome больше с февраля 2020 года, значение по умолчанию стало "слабым").

Теперь, с упомянутыми мною КБ, значением по умолчанию стало "Строгое", поэтому моя аутентификация в моем случае больше не работает.

Итак, мне придется вручную указать для того же атрибута sites моего auth cook ie значение «Нет», и подумать о проблемах безопасности, которые могут возникнуть с этим. В крайнем случае, я мог бы просто использовать одно и то же доменное имя для моих двух сайтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...