Подтвердить что ты не робот

Запрос CORS с IE11

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

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

Я использую jquery-2.0.3.min.js

Любые идеи, почему это не работает в IE11?

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

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

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

SEC7118: XMLHttpRequest для 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));

}

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

4b9b3361

Ответ 1

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

Ответ 2

Обнаружена проблема.

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

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

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

Ответ 3

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\"");
  }

Ответ 4

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

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

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

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