Internet Explorer 10 игнорирует XMLHttpRequest 'xhr.withCredentials = true'
В настоящее время у меня проблема с межсетевым ajax-вызовом, использующим IE10 (в режиме IE10, а не совместимость).
Ситуация:
У меня два домена, http://a
и http://b
. У меня есть набор файлов cookie для http://b
. Я сейчас на странице http://a
.
Я хочу сделать запрос CORS на http://b
с помощью XMLHttpRequest (который должен работать, в соответствии с http://blogs.msdn.com/b/ie/archive/2012/02/09/cors-for-xhr-in-ie10.aspx) и включать cookie в запросе.
JS выглядит следующим образом:
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://b', true);
xhr.withCredentials = true;
xhr.send();
Это должно гарантировать, что файл cookie прикреплен к запросу; однако трассировка Fiddler показывает, что cookie не прикреплен, и я получаю 401: Access Denied
.
Сервер настроен на работу с CORS, он включает заголовки Access-Control:
Access-Control-Allow-Origin: http://a
Access-Control-Allow-Credentials: true
(это не должно иметь никакого значения, поскольку запрос предварительной проверки OPTIONS отсутствует, и первый запрос IE посылает GET, а файл cookie отсутствует, что вызывает 401).
Кроме того, фрагмент JS отлично работает как в Firefox, так и в Opera.
Ответы
Ответ 1
Это, вероятно, такая же старая проблема IE P3P. С настройками по умолчанию IE, если cookie установлен без заголовка P3P, присутствующего в ответе, файл cookie помечен как "только для сторонних производителей". Это означает, что в стороннем контексте, таком как iframe или запрос CORS, IE откажется отправить файл cookie.
Чтобы исправить это, вы должны указать заголовок P3P при настройке файлов cookie. Подробнее см. http://msdn.microsoft.com/en-us/library/ms537343%28v=vs.85%29.aspx.
Обновление: ссылка уже мертва, но вы можете увидеть ее в в интернет-архиве
Ответ 2
У меня была аналогичная проблема, и выяснилось, что в настройках браузера блокируются сторонние файлы cookie (IE10 > Свойства обозревателя > Конфиденциальность > Дополнительно > Сторонние файлы cookie > Принять). Чтобы решить эту проблему, я проверил "Переопределить автоматическую обработку файлов cookie", "Принять" (сторонние файлы cookie) и "Всегда разрешать файлы cookie сеанса".
Ответ 3
Мы добавили заголовок Vary: cookie, и он сработал.