Запрос CORS с IE11



У меня есть запрос CORS (cross origin resource sharing), поступающий с моей страницы входа на сайт приложения по другому URL. У меня есть простая страница, которую я пингую, чтобы определить, если пользователь уже вошел в систему, и если да, то перенаправляет их. В противном случае я показываю страницу входа в систему. Я использую jQuery.



Это отлично работает в safari, chrome, firefox... и не ИП (естественно). Согласно MS, IE 10 и более поздние версии должны поддерживать запросы CORS с withCredentials



Я использую в jQuery-2.0.3.минута.js



Есть идеи, почему это не работает в IE11?



EDIT: похоже, что он частично работает, так как теперь возвращает значение {"id":false}. Это происходит каждый раз, что означает, что сервер никогда не получает учетные данные. Я также публикую свою страницу is_logged_in, я использую фреймворк code igniter.



EDIT: после включения "разрешить источники данных между доменами" в настройках безопасности IE, я больше не получаю никаких ошибок сообщения.



точная ошибка, которую я получаю:




SEC7118: XMLHttpRequest for http://mysite.net/guest/is_logged_in требуется совместное использование ресурсов разных источников (CORS).




$.ajax({
url: 'http://mysite.net/guest/is_logged_in',
type: 'POST',
crossDomain: true,
xhrFields: {
withCredentials: true
},

dataType: 'json',
success: function(data) {

if(data.id) {
window.location.replace("http://mysite.net");
}
}
});


И



public function is_logged_in()
{
$allowed = array(
'http://mysite.net',
'http://www.mysite.net',
'http://www.mysite.com',
);

$url = $_SERVER['HTTP_REFERER'];
$url = substr($url, 0, strpos($url, '/', 8));
if(isset($_SERVER['HTTP_ORIGIN']))
{
if(in_array($_SERVER['HTTP_ORIGIN'], $allowed))
{
$this->output->set_header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
}
}
else
{
if(in_array($url, $allowed))
{
$this->output->set_header('Access-Control-Allow-Origin: ' . $url);
}
}


$this->output->set_header('Access-Control-Allow-Headers: X-Requested-With');
$this->output->set_header('Access-Control-Allow-Credentials: true');
$this->output->set_header("Access-Control-Expose-Headers: Access-Control-Allow-Origin");


//TODO: Try to detect if this is an ajax request, and disallow it if not.

$data = new stdClass();
$this->load->library("ion_auth");
if($this->ion_auth->logged_in())
{
$data->name = $this->ion_auth->user()->row()->first_name;
$data->id = $this->ion_auth->get_user_id();
} else {
$data->id = false;
}

$this->output->set_output(json_encode($data));

}


Заранее спасибо

762   6  

6 ответов:

Изменение параметра "доступ к источникам данных через домены" на Enabled отключает междоменные проверки в IE и является ужасно небезопасным. Вместо этого вам нужно убедиться, что целевой сторонний ресурс отправляет действительную политику P3P, которая указывает, что он не делает ужасных вещей для конфиденциальности пользователя.

Нашел проблему.

У меня была аналогичная проблема (использование CORS в целом, а не конкретно GWT). Оказалось, что настройки браузера блокировали сторонние программы. файлы cookie (IE10 > Свойства обозревателя > конфиденциальность > дополнительно > третья сторона Cookies > Принять). Чтобы решить проблему, я проверил "переопределить автоматический обработка файлов cookie", "принять" (сторонние файлы cookie) и " всегда разрешать сеансовые файлы cookie."

Эндрю ответил на этот вопрос здесь: CORS не работает с cookies в IE10

EDIT: (теперь, когда я знаю, что искать) этот вопрос тоже может помочь, если кто-то еще столкнется с этой проблемой. Internet Explorer 10 игнорирует XMLHttpRequest ' xhr.withCredentials = true '

У нас была проблема, что, за исключением любого другого браузера, IE11 отправляет Access-Control-Request-Headers: accept с запросом, поэтому "accept" пришлось добавить в конфигурацию allowedHeaders cors, потому что она, похоже, не является частью конфигурации spring cors по умолчанию.

IE10 требует, чтобы сервер возвращал допустимую политику P3P в дополнение к заголовкам CORS для междоменных запросов. Ниже приведен пример php-кода для возврата заголовка P3P с сервера.

  $szOrigin = $_SERVER['HTTP_ORIGIN'];
  if ($szOrigin != null)
  {
        header("Access-Control-Allow-Origin: $szOrigin");
        header("Access-Control-Allow-Credentials: true");
        header("P3P: CP=\"ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI\"");
  }

После долгих поисков я обнаружил, что страница, которую я пингую с помощью ajax, находится в зоне интернета, а моя текущая страница - в зоне интрасети.

IE 11 имеет" защищенный режим", включенный для интернет-сайтов, и когда это включено, файлы cookie не отправляются на сайт, который я просматриваю, даже если они принадлежат к этому домену.

Добавление страницы на доверенные сайты или отключение "защищенного режима" решило проблему.

Обратите внимание, что эта проблема не возникает, когда оба сайты находятся в зоне интернета даже при включенном "защищенном режиме".

У меня была аналогичная проблема, и я обнаружил, что ни axios, ни jquery не могут работать с Internet Explorer и проблемой preflight/CORS. Работал только старый добрый XMLhttpRequest. Потому что в чистом XMLhttpRequest мы можем сделать это:

if (xhttp.readyState == 4 && xhttp.status == 200)

Похоже, что axios и jquery учитывают статус, а не readyState - они каким - то образом интерпретируют, что существует проблема cors-и требуется несколько тиков, чтобы достичь readyState == 4 в IE.

Comments

    Ничего не найдено.