Видимо, это ошибка в IE11 в Windows 7 и Windows 8 / 8.1.Я обнаружил, что браузер отправляет cookie csrftoken
, но забывает обязательный параметр x-csrftoken
HTTP Header, который используется всеми другими браузерами, включая более старые и новые версии 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