CORS solicitud con IE11

Tengo un CORS (origen de la cruz de intercambio de recursos) solicitud de mi página de inicio de sesión para el sitio de la aplicación, en una URL diferente. Tengo una simple página me ping para determinar si un usuario ya está conectado, y si es así, redirige. De lo contrario mostrar una página de inicio de sesión. Yo uso jQuery.

Esto funciona muy bien en safari, chrome, firefox… y no IE (naturalmente). De acuerdo a MS, es decir, 10 y posteriormente se debe apoyar CORS solicitudes con withCredentials

Estoy usando jquery-2.0.3.min.js

Alguna idea de por qué esto no funciona en IE11?

EDIT: parece como si ESTÁ parcialmente de trabajo, como lo es ahora la devolución de un valor de {«id»:false}. Esto sucede todo el tiempo, lo que significa que el servidor no es nunca llegar las credenciales. También estoy publicando mis is_logged_in página, estoy utilizando el código de ignición del marco.

EDIT: Después de activar «Permitir fuentes de datos a través de dominios» bajo es decir, la configuración de seguridad, yo ya no recibe los mensajes de error.

El error exacto que recibo es:

SEC7118: XMLHttpRequest para http://mysite.net/guest/is_logged_in requiere Origen de la Cruz de Compartir Recursos (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");
    }
}
});

y

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

}

Gracias de antemano

  • Por casualidad tienes «Misceláneos -> Acceso a fuentes de datos a través de dominios» configuración de su Internet -> opciones de Seguridad desactivado?
  • El hecho de que usted está redirigiendo en el éxito hace que me pregunte si usted necesita ajax para esto en absoluto.
  • Como cuestión de hecho, fue establecido en «desactivado». Me han permitido, y aún así no funciona, pero ahora no hay error.
  • tal vez tiene una versión anterior de este js (antes de agregar la ‘withCredentials’ configuración) sentado en su caché de IE (IE ama a la caché. Le encanta)? Sólo una suposición aquí. Es decir que ama a los datos de la caché de peticiones ajax demasiado. Asegúrese de usar algo como: $.ajaxSetup({cache: false}).
  • El hecho de que ya no te da un error, dice que el ajax fue un éxito (o al menos que el servidor respondió y el guión tenía las credenciales para continuar). ¿Cuál es la respuesta que el servidor es la salida? edit: tal vez es el location.replace cosa? Trate de comprobar primero si el código va en el éxito de bloque con sólo el window.alert(data)
  • Hice algunas busques más: me abrió los detalles de la red y agarró la respuesta de la llamada ajax. Se incluyó un error PHP, porque IE no enviar el HTTP_ORIGIN cabecera, donde como supongo Chrome, Safari, y FF hacer. Me fijo en que, y ahora vuelvo a la adecuada «no se registra en la» respuesta». Esto significa que va a través de, comprobación, a falta de la verificación, y devolver false.
  • podría usted por favor, marque su pregunta como respondida. Creo que al menos va a ayudar a la gente en el futuro para diagnosticar problemas iniciales.
  • los encabezados de p3p simplemente funciona, aquí está el nginx config ( 1 línea ! ) : gist.github.com/radzikowski/2908924

InformationsquelleAutor Drew | 2013-11-25

6 Kommentare

  1. 18

    Cambiar el valor de «Acceso a orígenes de datos entre dominios» a Activado desactiva la cruz-comprobaciones de dominio en IE y es terriblemente peligroso. En su lugar, usted necesita para asegurarse de que el objetivo de la 3º parte de los recursos que envía un válido de la política P3P que indica que no está haciendo cosas horribles a la privacidad del usuario.

    • Miré en el P3P, pero se decidió en contra de ella, ya que no es muy utilizado. De Wikipedia > P3P fue desarrollado por el World Wide Web Consortium (W3C) y recomendada oficialmente el 16 de abril de 2002. Desarrollo cesado poco después y ha habido muy pocas implementaciones de P3P. Microsoft Internet Explorer es el único navegador compatible con P3P
    • Usted: «¿por Qué no mi trabajo de código en IE?» Yo: «Porque IE requiere P3P.» Usted: «Pero P3P no es muy utilizado, excepto en IE.» Me: «…»
    • Esa es una forma elegante de poner mi postura (: Y sí, si esta fue una característica fundamental, yo sería la implementación de una política P3P. Te voy a dar la respuesta, porque usted es técnicamente correcta, y esa es la mejor forma de corregir.
    • He añadido P3P en el encabezado de respuesta, pero sigue sin ir. Sólo puedo cambiar «Acceso a orígenes de datos entre dominios» permitir hacer el trabajo!
    • También traté de agregar P3P encabezado en la respuesta y no ayuda.
    • Porque el problema es completamente diferente de la original del cartel. Por favor, abra una nueva pregunta en StackOverflow y pegar en el contenido de la tecla F12 Depurador de secuencias de Comandos de registro cuando los escenarios de falla.
    • Estoy usando internet explorer 11 (11.0.9600.18639) en Win 7 Pro y mi objetivo 3ra parte de los recursos se ajuste siguiente CP=»TODOS los DSP COR CUR ADM TAI NUESTRO IND COM NAV INT» puedo ver bien en Fiddler, pero todavía estoy viendo la advertencia emergente «Esta página es de acceso a información que no esté bajo el control de ti…». Por favor, sugiera lo que me estoy perdiendo.
    • La política P3P no es lo que hace que el «Esta página es de acceso a la información…» advertencia.
    • A continuación, puede usted por favor me apunte en la dirección en que lo hace. Cualquier puntero será apreciado. No quiero establecer «Acceso a orígenes de datos entre dominios» pero puedo agregar Encabezados.
    • La forma correcta de hacer una pregunta en StackOverflow es hacer clic en el big blue «haz una pregunta» botón en la parte superior derecha de la página. Su pregunta es: «¿Cómo puedo permitir cruz-origen de acceso a datos usando CORS?», que probablemente se ha preguntado muchas veces ya.

  2. 13

    Encontrado el problema.

    He tenido un problema similar (utilizando CORS en general, no específicamente GWT).
    Resultó que la configuración del navegador se bloquea de terceros
    las cookies (IE10 > Opciones de Internet > Privacidad > Avanzado > Tercero
    Las Cookies > Aceptar). Para resolver el problema, he comprobado «Invalidar la administración automática de
    manejo de cookies», «Aceptar» (Cookies de Terceros) y «permitir Siempre
    cookies de sesión».

    Andrew respondió a esta pregunta aquí: CORS no funciona con las cookies en IE10

    EDICIÓN: (Ahora que sé de qué buscar) Esta pregunta puede dar un poco de ayuda demasiado, si alguien se topa con este problema. Internet Explorer 10 es ignorar XMLHttpRequest ‘xhr.withCredentials = true’

    • Sí se ha solucionado un problema similar, para mí también.
  3. 3

    Hemos tenido el problema de que, a excepción de todos los demás navegador, el IE11 enviar Access-Control-Request-Headers: accept con la solicitud, por lo que «aceptar» tenía que ser añadido a la allowedHeaders cors de configuración, porque no parece ser parte de la predeterminada primavera cors de configuración.

    • En mi caso envía Access-Control-Request-Headers: content-type, accept
    • solucionado mi problema, gracias!
  4. 0

    IE10 requiere que el servidor devuelva un válido de la política P3P además de CORS encabezados por cruz dominio de las solicitudes. Aquí es el ejemplo de código php para el retorno de un P3P encabezado desde el servidor.

      $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\"");
      }
  5. 0

    Después de un montón de excavación he encontrado que la página que estoy haciendo ping usando ajax es en la zona de internet, mientras que mi página actual en la zona de intranet.

    Es decir, 11 tiene el «Modo Protegido» habilitado para sitios de internet y cuando este está habilitado el uso de cookies no están siendo enviados al sitio que estoy ping incluso si pertenecen a ese dominio.

    Añadir la página a los sitios de confianza, o la desactivación de «Modo Protegido» resuelto el problema.

    Tenga en cuenta que este problema no ocurre cuando ambos sitios se encuentran en la zona de internet, incluso cuando «Modo Protegido» está habilitada.

  6. 0

    He tenido un problema similar y encontró que ni axios o jquery se puede hacer para trabajar con Internet Explorer y comprobaciones/CORS problema. Sólo la buena vieja XMLhttpRequest trabajado. Porque en el más puro XMLhttpRequest podemos hacer esto:

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

    Parece que axios y jquery tomar en cuenta la situación y no la readyState – que de alguna manera de interpretar que hay un cors de problemas y toma un par de pasos para llegar a readyState == 4 en el IE.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea