web-dev-qa-db-fra.com

Demande CORS avec IE11

J'ai une demande CORS (Cross Origin Resource Sharing) provenant de ma page de connexion sur le site de l'application, sur une URL différente. J'ai une page simple, je ping pour déterminer si un utilisateur est déjà connecté, et si oui, les redirige. Sinon, je montre une page de connexion. J'utilise jQuery.

Cela fonctionne très bien en safari, chrome, firefox ... et pas IE (naturellement). Selon MS, IE 10 et versions ultérieures devraient prendre en charge les demandes CORS avec withCredentials

J'utilise jquery-2.0.3.min.js

Des idées pourquoi cela ne fonctionne pas dans IE11?

EDIT: Il semble que IS fonctionne partiellement, car il renvoie maintenant une valeur de {"id": false}. Cela se produit à chaque fois, ce qui signifie que le serveur ne reçoit jamais les informations d'identification. Je publie également ma page is_logged_in, j'utilise le framework igniter de code.

EDIT: Après avoir activé "Autoriser les sources de données sur plusieurs domaines" dans les paramètres de sécurité d'IE, je ne reçois plus aucun message d'erreur.

L'erreur exacte que je reçois est:

SEC7118: XMLHttpRequest pour http://mysite.net/guest/is_logged_in requis le partage de ressources d'origine croisée (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");
    }
}
});

et

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));

}

Merci d'avance

22
Drew

Le réglage du paramètre "Accéder aux sources de données de plusieurs domaines" sur Activé désactive les vérifications entre domaines dans IE et est extrêmement dangereux. Au lieu de cela, vous devez vous assurer que la ressource tierce cible envoie une stratégie P3P valide qui indique qu'elle ne nuit pas à la confidentialité de l'utilisateur.

18
EricLaw

Trouvé le problème.

J'ai eu un problème similaire (utilisation de CORS en général, pas spécifiquement GWT) . Il s’est avéré que les paramètres du navigateur bloquaient des tiers cookies (IE10> Options Internet> Confidentialité> Avancé> Tiers Cookies> Accepter). Pour résoudre le problème, j'ai coché "Ignorer la gestion automatique des cookies.", "Accepter" (cookies tiers) et "Toujours autoriser les cookies de session.".

Andrew a répondu à cette question ici: CORS ne fonctionne pas avec les cookies dans IE10

EDIT: (maintenant que je sais quoi chercher) Cette question peut aussi aider, si quelqu'un d'autre se heurte à ce problème. Internet Explorer 10 ignore XMLHttpRequest 'xhr.withCredentials = true'

13
Drew

Nous avons eu le problème que, sauf pour tous les autres navigateurs, IE11 envoyait Access-Control-Request-Headers: accept avec la demande, donc "accepter" a dû être ajouté à la configuration de allowedHeaders cors, car il ne semble pas faire partie de la configuration par défaut des ressorts.

2
RiZKiT

IE10 exige que le serveur renvoie une stratégie P3P valide en plus des en-têtes CORS pour les demandes interdomaines. Voici un exemple de code php permettant de renvoyer un en-tête P3P à partir du serveur.

  $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\"");
  }
0
3spot

Après de nombreuses recherches, je me suis rendu compte que la page sur laquelle je clingue avec ajax se trouvait sur la zone Internet, tandis que ma page actuelle se trouvait sur la zone Intranet.

IE 11 a activé le "Mode protégé" pour les sites Internet. Lorsque cette option est activée, les cookies ne sont pas envoyés au site sur lequel je cingle, même s'ils appartiennent à ce domaine.

L'ajout de la page aux sites de confiance ou la désactivation du "mode protégé" a résolu le problème.

Notez que ce problème ne se produit pas lorsque les deux sites se trouvent dans la zone Internet, même lorsque le "Mode protégé" est activé.

0
Fadi

J'avais un problème similaire et je n'ai trouvé ni axios ni jquery capables de fonctionner avec Internet Explorer et le problème preflight/CORS. Seul le bon vieux XMLhttpRequest a fonctionné. Parce que dans XMLhttpRequest pur, nous pouvons faire ceci:

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

Il semble que axios et jquery tiennent compte du statut et non du readyState - ils interprètent en quelque sorte qu’il existe un problème critique - et il faut quelques ticks pour atteindre readyState == 4 dans IE.

0
dataplumber