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 lawindow.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
Vous devez vous connecter pour publier un commentaire.
De modifier le réglage pour "Accès aux sources de données sur plusieurs domaines" pour Activé désactive la croix-domaine vérifie dans IE et est terrible et dangereux. Au lieu de cela, vous devez vous assurer que la cible de la 3e partie des ressources envoie un valide politique P3P. qui indique que ce n'est pas faire des choses horribles à l'intimité de l'utilisateur.
Trouvé le problème.
Andrew répondu à cette question ici: La SCRO ne fonctionne pas avec les cookies dans IE10
EDIT: (Maintenant que je sais quoi chercher) Cette question peut donner un peu d'aide aussi, si quelqu'un d'autre s'exécute sur cette question. Internet Explorer 10 est ignorant XMLHttpRequest 'xhr.withCredentials = true'
Nous avons eu le problème que, à l'exception de tous les autres navigateur, le IE11 envoyer
Access-Control-Request-Headers: accept
avec la demande, afin de "accepter" devait être ajouté à la allowedHeaders de la scro de configuration, car il ne semble pas être une partie de la valeur par défaut printemps de la scro de configuration.Access-Control-Request-Headers: content-type, accept
IE10 nécessite que le serveur de retour valide politique P3P en plus de la SCRO en-têtes de la croix de domaine de demandes de. Voici un exemple de code php pour le renvoi d'un en-tête P3P à partir du serveur.
Après beaucoup de creuser, j'ai trouvé que la page que je suis une requête ping à l'aide d'ajax est sur la zone internet alors que ma page en cours dans la zone intranet.
IE 11 a la "Mode Protégé" activé pour des sites internet et lorsque cette option est activée les cookies ne sont pas envoyés sur le site que je suis ping, même s'ils appartiennent à ce domaine.
Ajout de la page pour les sites de confiance ou de désactiver le "Mode Protégé" a résolu le problème.
Notez que ce problème ne se produit pas lorsque les deux sites sont dans la zone internet, même lorsque le "Mode Protégé" est activé.
J'ai eu le même problème et a trouvé que ni axios ou jquery peut être faite pour fonctionner avec Internet Explorer et le contrôle en amont/SCRO question. Seulement bon vieux XMLhttpRequest travaillé. Parce que dans le plus pur XMLhttpRequest nous pouvons le faire:
Il semble que l'axios et jquery tiennent compte de la situation et de ne pas la readyState - ils en quelque sorte interpréter qu'il y a un problème de la scro - et cela prend un peu de tiques pour atteindre readyState == 4 dans IE.