IE11 не устанавливает HTTP-заголовок x-cfrtoken, если только с окном InPrivate это не приводит к тому, что сервер отвечает HTTP 403 Access Denied

Я был сбит с толку этим уже два дня. Ситуация:

  • Простой веб-сайт, работающий в Websharper, экран входа в систему, одно представление, через XHR с ответами приложения/json
  • Сайт запускается из iframe с разными доменами (я не могу это изменить, но у меня есть доступ к обоим сайтам). Без iframe проблем нет.
  • Вы должны увидеть ошибку с ошибочным входом в систему, но это не работает в IE11 в Windows 7. Это работает в том же IE11 в режиме InPrivate и в любом IE11 в Windows 10. Это не проблема кэширования.
  • Сайт устанавливает куки-файлы, но работает без куки-файлов, если куки-файлы установить невозможно (например, iPhone)

Похоже, что в режиме InPrivate x-csfrtoken устанавливается в заголовке запроса, вне режима InPrivate этот заголовок не устанавливается. Затем сервер возвращает ошибку HTTP 403, которая, по-видимому, является корнем проблемы.

Я не знаю, как указать серверу (IIS) игнорировать этот токен.

Чтобы увидеть это поведение в действии, перейдите на этот сайт и введите что-нибудь, а затем нажмите «Inloggen». Вы должны увидеть ошибку входа (на голландском языке), но в IE11 в Windows 7 эта ошибка не появляется.

Я попробовал это решение Microsoft с неправильными правами на LocalLow, но оно не решило проблему и в остальном кажется не связанным.


person Abel    schedule 25.04.2018    source источник


Ответы (1)


Судя по всему, это ошибка IE11 в Windows 7 и Windows 8/8.1. Я обнаружил, что браузер отправляет файл cookie csrftoken, но забывает обязательный параметр x-csrftoken HTTP-заголовка, который используется всеми другими браузерами, включая старые и новые версии IE и IE11. Windows 10 правильно отправляет.

Если ваша цепочка инструментов защищает себя, проверяя x-csrftoken (что рекомендуется любой структурой), то это не удается с IE11. Это обсуждалось здесь для WebSharper, но полного решения пока нет.

Обходной путь, который, как я обнаружил, работает правильно, заключается в следующем. Это хакерство, оно изменяет заголовки HTTP по прибытии, но это делают и другие инструменты (например, прокси-серверы). Вот код для размещения в global.asax.fs на F#, если вы используете WebSharper (немного запутанно, но я оставлю очистку в качестве упражнения для читателя ;)).

member __.Application_BeginRequest(sender: obj, args: System.EventArgs) =
    HttpContext.Current
    |> function
    | null -> ()
    | ctx ->
        match ctx.Request with
        | null -> ()
        | req ->
            match req.Cookies.Item "csrftoken", req.Headers.Item "x-csrftoken" with
            | null, null -> ()
            | cookie, null ->
                // fix for IE11, which does not always set the HTTP Header "x-csrftoken"
                try req.Headers.Item "x-csrftoken" <- cookie.Value
                with _ -> ()       // ignore possible errors
            | null, _ ->
                // if header is set but cookie is not, there's nothing we can do (cookie collection is read-only)
                ()
            | cookie, csrfHeader when cookie.Value <> csrfHeader ->
                try req.Headers.Item "x-csrftoken" <- cookie.Value
                with _ -> ()       // ignore possible errors
            | _ ->
                ()      // all is fine, the default: cookie "csfrtoken" and header "x-csfrtoken" are equal
person Abel    schedule 25.04.2018