La SCRO demande avec IE11

J'ai un CORS (cross origin resource sharing) demande à venir de ma page de connexion à 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 rediriger. Sinon, je montre une page de connexion. J'utilise jQuery.

Cela fonctionne très bien dans safari, chrome, firefox... et pas IE (naturellement). Selon MME, IE 10 et les versions ultérieures devraient soutenir La SCRO demandes avec withCredentials

Je suis en utilisant jquery-2.0.3.min.js

Des idées pourquoi ce n'est pas au travail IE11?

EDIT: Il semble que c'EST en partie de travail, comme il est maintenant de retour d'une valeur de {"id":false}. Cela se produit à chaque fois, ce qui signifie que le serveur n'est jamais obtenir les informations d'identification. Je suis également l'affichage de mon is_logged_in page, je suis en utilisant le code de l'allumeur cadre.

EDIT: Après l'activation de "Permettre à des sources de données sur plusieurs domaines" sous IE les paramètres de sécurité, je ne plus recevoir les messages d'erreur.

L'erreur exacte que je reçois est:

SEC7118: XMLHttpRequest pour http://mysite.net/guest/is_logged_in nécessaire de la Croix-Origin Resource sharing (SCRO).

$.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

  • Par hasard, vous avez "Divers -> Accès aux sources de données sur plusieurs domaines" dans votre Internet -> options de Sécurité désactivé?
  • Le fait que vous êtes rediriger dans la réussite me fait me demander si vous avez besoin d'ajax pour ce tout.
  • Comme une question de fait, il a été réglé sur "désactivé". Je l'ai activé, et il ne fonctionne toujours pas, mais maintenant il n'y a pas d'erreur non plus.
  • avez-vous peut-être une ancienne version de ce js (avant l'ajout de la 'withCredentials paramètre) assis dans votre cache IE (IE aime cache. Il aime)? Juste deviner ici. IE aime mettre des données en cache de requêtes ajax trop. Assurez-vous que vous utilisez quelque chose comme: $.ajaxSetup({cache: false}).
  • Le fait qu'il ne donne plus de vous avez un message d'erreur indique que l'ajax a réussi (ou au moins que le serveur a répondu et le script avait des informations d'identification pour continuer). Quelle est la réponse que le serveur est sortie? edit: c'est peut-être le location.replace chose? Essayez tout d'abord de vérifier si le code est inclus dans le succès de bloc avec juste la window.alert(data)
  • J'ai fait un peu plus de creuser: j'ai ouvert les détails du réseau et attrapa la réponse de l'appel ajax. Elle comportait une erreur PHP, parce que IE n'envoie pas le HTTP_ORIGIN en-tête, où, comme je suppose que google Chrome, Safari et FF ne. J'ai corrigé ça, et maintenant je serai de retour le bon "pas connecté" réponse. Cela signifie qu'il va à travers, la vérification, à défaut de le vérifier, et en renvoyant false.
  • pourriez-vous veuillez cocher votre question dans la réponse. Je pense qu'au moins il va aider les gens dans le futur pour diagnostiquer les problèmes initiaux.
  • p3p les en-têtes de marche, tout simplement, voici la config nginx ( 1 ligne ! ) : gist.github.com/radzikowski/2908924

InformationsquelleAutor Drew | 2013-11-25