2012-02-28 25 views
5

Estoy investigando el uso entre dominios de un servicio de dominio .NET WCF desde una aplicación html local (archivo: // acceso). La aplicación está utilizando jQuery para llamadas AJAX.jQuery.Ajax ¿Explicación de "acceso a URI denegado restringido"?

Sin autenticación (es decir, con autenticación anónima) en el servidor, he recuperado correctamente los datos en formato JSON con el encabezado CORS "Access-Control-Allow-Origin: *" en su lugar y en formato JSONP sin el encabezado.

Ahora trato de entender el comportamiento cuando la autenticación y el encabezado CORS están en su lugar con datos de formato JSON (no JSONP).

El siguiente código de jQuery enviará una solicitud al servidor, que a su vez responde con "HTTP/1.1 401 no autorizado".

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    cache: false, 
    complete: function() { /* do stuff */ }, 
    timeout: 5000, 
    data: myData 
}); 

El siguiente código de jQuery no hace una petición al servidor y lanza inmediatamente una excepción "Acceso a la URI restringido denegado", código 1012.

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    cache: false, 
    complete: function() { /* do stuff */ }, 
    timeout: 5000, 
    username: "chris", 
    password: "password", 
    data: myData 
}); 

entiendo y esperan que el primer caso. ¿Alguien puede explicarme la excepción en el segundo caso? Hubiera esperado que la solicitud se hiciera al menos.

Editar: Grrr, esto es en FF 10.0.2. Chrome parece actuar como espero, ¿entonces este es un problema de FF?

Respuesta

0

Se podría utilizar una función de devolución de llamada para superar esto: http://docs.jquery.com/Ajax/jQuery.ajax#options

+0

Me doy cuenta de que puedo detectar el error con una de las funciones de devolución de llamada jQuery.ajax, o usar una función de devolución de llamada con JSONP. ¿Eso es lo que quieres decir? Mi pregunta es realmente por qué (tal vez solo Firefox) no hace una solicitud y en su lugar genera un error en este escenario exacto. – Chris

5

Si utiliza credenciales tales como cookies o autenticación básica de HTTP nombre de usuario/campos de contraseña en su solicitud de origen cruzado, debe configurar también los "withCredentials "bandera en el XHR a verdadero. En jQuery, esto se hace con la propiedad xhrFields en la llamada $ .ajax. Cambiar el código para leer

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    cache: false, 
    complete: function() { /* do stuff */ }, 
    timeout: 5000, 
    username: "chris", 
    password: "password", 
    data: myData, 
    xhrFields: { withCredentials: true } 
}); 

Además, el servidor en el otro extremo no se puede utilizar "*" para el encabezado Access-Control-Allow-Origin y credenciales. En su lugar, tiene que proporcionar una coincidencia exacta para el encabezado de origen enviado a él.