2012-09-28 17 views
18

Actualmente estoy teniendo un problema con una llamada ajax entre dominios usando IE10 (en modo IE10, no compatibilidad).Internet Explorer 10 está ignorando XMLHttpRequest 'xhr.withCredentials = true'

Situación: Tengo dos dominios, http://a y http://b. Tengo una cookie establecida para http://b. Actualmente estoy en la página http://a.

quiero hacer una petición a CORS http://b usando XMLHttpRequest (que deberían funcionar, de acuerdo con http://blogs.msdn.com/b/ie/archive/2012/02/09/cors-for-xhr-in-ie10.aspx), e incluyen la cookie en la solicitud. La JS es el siguiente:

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://b', true); 
xhr.withCredentials = true; 
xhr.send(); 

Esto debería garantizar que la cookie se adjunta a la solicitud; sin embargo, el seguimiento de Fiddler muestra que no hay ninguna cookie adjunta, y obtengo 401: Access Denied.

El servidor está configurado para trabajar con CORS, que incluye las cabeceras de control de acceso:

Access-Control-Allow-Origin: http://a 
Access-Control-Allow-Credentials: true 

(esto no debe hacer ninguna diferencia, ya que no hay opciones de solicitud de verificación previa y la primera solicitud IE envía es un GET, y la cookie no está presente, lo que causa un 401).

Además, el fragmento JS funciona bien tanto en Firefox como en Opera.

+0

Nota: estoy viendo el mismo comportamiento cuando se utiliza jQuery, con 'xhrFields: { withCredentials: true}' – Luuseens

+2

no tengo IE10 , pero tengo un sitio de prueba de CORS. ¿Puedes probar la siguiente solicitud en IE10 y ver si funciona? Simplemente haga clic en el botón "Enviar solicitud" y vea cuál es la respuesta. Lo intenté y funciona en Chrome. Si no funciona en IE, podría ser un error: http://client.cors-api.appspot.com/client?server.enable=true&server.credentials=true&server.httpstatus=200&client.method=GET&client.credentials = verdadero – monsur

+3

@monsur - He hecho más pruebas. IE10 funciona en la página que proporcionó, parece que IE10 admite 'xhr.withCredentials' en páginas que tienen un nombre de dominio de segundo nivel coincidente (por ejemplo,' http: // abcom' hablando con 'http: // cbcom') , pero no cuando los nombres de dominio de segundo nivel no coinciden (por ejemplo, http://a.com hablando con http://b.com) – Luuseens

Respuesta

23

Probablemente sea el mismo viejo problema de IE P3P. Con la configuración predeterminada de IE, si una cookie se establece sin un encabezado P3P también presente en la respuesta, la cookie se marca como "de primera parte solamente". Lo que significa que en un contexto de terceros, como un iframe o una solicitud CORS, IE se negará a enviar la cookie.

Para solucionarlo, debe proporcionar un encabezado P3P al configurar las cookies. Vea http://msdn.microsoft.com/en-us/library/ms537343%28v=vs.85%29.aspx para más detalles.

Actualización: Enlace ahora está muerto, pero se puede ver que en the Internet Archive

+0

Esta es la respuesta correcta a la pregunta – Woody

+1

Sería bueno que la respuesta se actualizase a lo que debe ser exactamente este encabezado para ahorrar tiempo yendo por los documentos :) –

+0

El encabezado correcto depende de las políticas de privacidad de su sitio web. O simplemente podría hacer lo mismo que Google (su encabezado es actualmente "p3p: CP =" ¡Esta no es una política de P3P! Consulte http://www.google.com/support/accounts/bin/answer.py?hl=es&answer = 151657 para obtener más información. "") – Anomie

-1

tuve un problema similar, y resultó que la configuración del navegador estaban bloqueando las cookies de terceros (Opciones IE10> Internet> Privacidad> Avanzado> Cookies de terceros> Aceptar). Para resolver el problema, marqué "Anular el manejo automático de cookies", "Aceptar" (Cookies de terceros) y "Permitir siempre cookies de sesión".

+0

Tengo cookies de terceros permitidas, pero esto no detuvo el problema si se inscriben repetidamente. –

-1

Hemos añadido una cabecera Vary: Galleta y funcionó ..

Cuestiones relacionadas