Tengo una asp.NET WCF en .NET 4. Este servicio se utiliza para autenticar a los usuarios. Estamos presentando un nombre de usuario y la contraseña y, a continuación, un Encabezado HTTP deberá ser devuelto con la cookie de autenticación incluido. El uso de un alojado localmente página de prueba de que esto funcione correctamente. Ahora estoy tratando de acceder a la información de la cabecera de la cruz de dominio. He instalado mi página de prueba en una máquina diferente y configurado para llamar a través de a la WCF. La llamada es de trabajo y de los ‘datos’ respuesta en la llamada es correcta. Sin embargo, soy incapaz de acceder a la información de encabezado con cualquiera de los siguientes:

alert(xmlHttp.getAllResponseHeaders());

o

alert(xmlHttp.getResponseHeader("Set-Cookie"));

Utilizando el depurador en el IE y el «Live HTTP Header’ plugin para Firefox, puedo ver la información de encabezado que se devuelve.

En mi global página ajax estoy ajuste de la respuesta a manejar CORS.

private void EnableCrossDomainAjaxCall()
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");


    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {

        HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");

        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    }

}

Este es el AJAX estoy usando para llamar al servicio:

$("#btnLogin").click(function(e) {
    var geturl;
    geturl = $.ajax({
        //type: "POST",
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: 'http://10.0.4.66/AuthenticationService.svc/Login?Name=test&password=pwsd',
        //url: '../SecurityServer/AuthenticationService.svc/Login?Name=test&password=pwsd',
        dataType: "jsonp",
        error: function(request, status, error) {
            alert('Error Occured');
        },
        crossdomain: true,
        success: function(data, textStatus, xmlHttp) {
            //alert(xmlHttp.getResponseHeader("Content-Type"));
            document.write(xmlHttp.getResponseHeader("Content-Type") + "<br/>");
            alert(xmlHttp.getAllResponseHeaders());
            alert(xmlHttp.getResponseHeader("Set-Cookie"));
            var headers = '';
            var headerPair = xmlHttp.getAllResponseHeaders('wcfCookie').split("\r\n");
            var output = '';
            $.each(headerPair, function(key, line) {
                var parts = line.split(':');

                if (parts[0] == 'wcfCookie') {
                  ChocChip = parts[1]
                  return false
                }

            });
        }
    });

A continuación es mi información de encabezado agarró de ‘Live HTTP headers’

Date: Mon, 04 Feb 2013 12:12:40 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
Access-Control-Allow-Origin: *
Set-Cookie: wcfCookie=8D38D5D6A0F138FEB595DD016F7694EDDF3E6757C82ED3D419F5047A5294974C1885487465CEC0A0BCC2B3802C7B03FF9F5370A05D4CCBDDDABCB1558C3816044BF4F78209BF38C6B1A7CAD34CD3C85C40B8515CFB1C2B2694BC78803D8DACB4
Content-Length: 65
Cache-Control: application/json; charset=utf-8
Content-Type: application/x-javascript
InformationsquelleAutor user2039547 | 2013-02-04

2 Comentarios

  1. 65

    Primero, un poco de historia:

    Está utilizando Access-Control-Allow-Headers, la cual especifica que solicitud encabezados el cliente puede enviar, pero no especifica que respuesta encabezados el cliente puede leer. Para permitir que el cliente lea no simple encabezados de respuesta, es necesario utilizar Access-Control-Expose-Headers. Desde el HTML5 Rocks CORS página:

    Durante un CORS solicitud, el getResponseHeader() método sólo puede acceder a simple encabezados de respuesta. Simple encabezados de respuesta se definen como sigue:

    • Cache-Control
    • Content-Language
    • Tipo De Contenido
    • Caduca
    • De Última Modificación
    • Pragma

    Si usted desea que los clientes puedan acceder a otras cabeceras, usted tiene que utilizar el Access-Control-Expose-Headers encabezado. El valor de este encabezado es una lista delimitada por comas de los encabezados de la respuesta que usted desea exponer al cliente.

    Así, dado que la nueva información, usted puede hacer:

    HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "Set-Cookie");

    …pero hay más a él que eso.

    Ahora, la respuesta real:

    Hay un problema más grave: el XHR especificación explictily no permite la lectura de Set-Cookie. Esto se debe a que es funcionalmente un cruz-dominio de la cookie de robo de ataque.

    Supongamos que el dominio hace una cruz solicitud de dominio para el dominio B. Cuando B en el dominio de los conjuntos de cookies, es la configuración de un dominio específico de cookies para el dominio B sólo. Cualquier intento por parte de Un dominio a leer B en el dominio de las cookies es una violación de la política de mismo origen de las galletas de acceso.

    No sé WCF, así que no estoy seguro de la mejor manera a en realidad hacer lo que quieras, pero me imagino que la solución podría ser la de pasar un auth token no a través de cookies (por ejemplo, un X-WCF-Auth encabezado?) que el dominio a lee y, a continuación, establece sus propias cookies.

  2. 2

    El navegador con las políticas de seguridad puede bloquear su respuesta porque no ha establecido:

    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials","true");

    Si eso no ayuda, trate de añadir

    xhrFields: { withCredentials: true }

    a su ajax opciones también podría ser vale la pena un tiro.

Dejar respuesta

Please enter your comment!
Please enter your name here