Cookies de dominio cruzado

Tengo dos webapps WebApp1 y WebApp2 en dos dominios diferentes.

  1. Estoy configurando una cookie en WebApp1 en HttpResponse.
  2. ¿Cómo leer la misma cookie de HttpRequest en WebApp2?

Sé que suena raro porque las cookies son específicas de un dominio dado, y no podemos acceder a ellas desde dominios diferentes; Sin embargo, he oído hablar de las cookies CROSS-DOMAIN que se pueden compartir en varias aplicaciones web. ¿Cómo implementar este requisito usando las cookies CROSS-DOMAIN?

Nota: Estoy intentando esto con webapps J2EE

Como dicen otras personas, no puedes compartir cookies, pero podrías hacer algo como esto:

  1. centralice todas las cookies en un solo dominio, digamos cookiemaker.com
  2. cuando el usuario realiza una solicitud a example.com lo redirecciona a cookiemaker.com
  3. cookiemaker.com lo redirige a example.com con la información que necesita

Por supuesto, no es completamente seguro, y tienes que crear algún tipo de protocolo interno entre tus aplicaciones para hacer eso.

Por último, sería muy molesto para el usuario si hace algo así en cada solicitud, pero no si es solo el primero.

Pero creo que no hay otra manera …

Sí, es absolutamente posible obtener la cookie de domain1.com por domain2.com. Tuve el mismo problema para un complemento social de mi red social, y después de un día de investigación encontré la solución.

Primero, en el lado del servidor debe tener los siguientes encabezados:

header("Access-Control-Allow-Origin: http://origin.domain:port"); header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Methods: GET, POST"); header("Access-Control-Allow-Headers: Content-Type, *"); 

Dentro del archivo PHP puedes usar $_COOKIE[name]

Segundo, en el lado del cliente:

Dentro de su solicitud de AJAX debe incluir 2 parámetros

 crossDomain: true xhrFields: { withCredentials: true } 

Ejemplo:

 type: "get", url: link, crossDomain: true, dataType: 'json', xhrFields: { withCredentials: true } 

Hasta donde yo sé, las cookies están limitadas por la política de “mismo origen”. Sin embargo, con CORS puede recibir y usar las cookies del “Servidor B” para establecer una sesión persistente desde el “Servidor A” en el “Servidor B”.

Aunque, esto requiere algunos encabezados en “Servidor B”:

 Access-Control-Allow-Origin: http://server-a.domain.com Access-Control-Allow-Credentials: true 

Y deberá enviar la marcawithCredentials ” en todas las solicitudes de “Server A” (por ejemplo: xhr.withCredentials = true; )

Usted puede leer sobre ello aquí:

http://www.html5rocks.com/en/tutorials/cors/

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

No hay cookies de dominio cruzado. Puede compartir una cookie entre foo.example.com y bar.example.com pero nunca entre example.com y example2.com y eso por razones de seguridad.

Haz lo que Google está haciendo. Crea un archivo PHP que establezca la cookie en los 3 dominios. Luego, en el dominio donde se va a establecer el tema, cree un archivo HTML que cargue el archivo PHP que establece cookies en los otros 2 dominios. Ejemplo:

    

Please wait.....

A continuación, agregue una callback de onload en la etiqueta del cuerpo. El documento solo se cargará cuando las imágenes se carguen por completo, es decir, cuando las cookies se establezcan en los otros 2 dominios. Retrollamada Onload:

     setcookie.php 

Configuramos las cookies en los otros dominios usando un archivo PHP como este:

  

Ahora las cookies se establecen en los tres dominios.

No puede compartir cookies entre dominios. Sin embargo, puede permitir que todos los subdominios tengan acceso. Para permitir que todos los subdominios de example.com tengan acceso, configure el dominio en .example.com .

Sin otherexample.com , no es posible dar acceso a otherexample.com a las cookies de example.com .

Puede intentar enviar el cookie val a otro dominio con una etiqueta de imagen.

Su kilometraje puede variar al intentar hacer esto porque algunos buscadores requieren que tenga una Política P3P adecuada en el dominio WebApp2 o el navegador rechazará la cookie.

Si consulta la política plus.google.com p3p, verá que su política es:

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”.

esa es la política que usan para sus botones +1 a estas solicitudes de dominios cruzados.

Otra advertencia es que si está en https, asegúrese de que la etiqueta de la imagen apunte a una dirección https; de lo contrario, las cookies no se configurarán.

Hay una descripción decente de cómo Facebook lo hace aquí en nfriedly.com

También hay huellas dactilares en el navegador, que no es lo mismo que una cookie, pero tiene un propósito similar ya que lo ayuda a identificar a un usuario con un cierto grado de certeza. Hay una publicación aquí en Stack Overflow que hace referencia a un método de huella digital

 function GetOrder(status, filter) { var isValid = true; //isValidGuid(customerId); if (isValid) { var refundhtmlstr = ''; //varsURL = ApiPath + '/api/Orders/Customer/' + customerId + '?status=' + status + '&filter=' + filter; varsURL = ApiPath + '/api/Orders/Customer?status=' + status + '&filter=' + filter; $.ajax({ type: "GET", //url: ApiPath + '/api/Orders/Customer/' + customerId + '?status=' + status + '&filter=' + filter, url: ApiPath + '/api/Orders/Customer?status=' + status + '&filter=' + filter, dataType: "json", crossDomain: true, xhrFields: { withCredentials: true }, success: function (data) { var htmlStr = ''; if (data == null || data.Count === 0) { htmlStr = '
Bu kriterlere uygun sipariş bulunamadı.
'; } else { $('#ReturnPolicyBtnUrl').attr('href', data.ReturnPolicyBtnUrl); var groupedData = data.OrderDto.sort(function (x, y) { return new Date(y.OrderDate) - new Date(x.OrderDate); }); groupedData = _.groupBy(data.OrderDto, function (d) { return toMonthStr(d.OrderDate) }); localStorage['orderData'] = JSON.stringify(data.OrderDto); $.each(groupedData, function (key, val) { var sortedData = groupedData[key].sort(function (x, y) { return new Date(y.OrderDate) - new Date(x.OrderDate); }); htmlStr += '
' + key + '
'; $.each(sortedData, function (keyitem, valitem) { //Date Convertions if (valitem.StatusDesc != null) { valitem.StatusDesc = valitem.StatusDesc; } var date = valitem.OrderDate; date = date.substring(0, 10).split('-'); date = date[2] + '.' + date[1] + '.' + date[0]; htmlStr += '
' + //'
Sipariş No: ' + valitem.OrderNumber + '' + date + '
' + '
Sipariş No: ' + valitem.OrderNumber + '' + date + '
' + '
' + valitem.StatusDesc + '
' + '
' + '
'; var i = 0; $.each(valitem.ItemList, function (keylineitem, vallineitem) { var imageUrl = vallineitem.ProductImageUrl.replace('{size}', 200); htmlStr += '
' + vallineitem.ProductName + '' + ProductNameStr(vallineitem.ProductName) + '
'; i++; }); htmlStr += '
' + '
' + '
'; }); }); $.each(data.OrderDto, function (key, value) { if (value.IsSAPMigrationflag === true) { refundhtmlstr = '
Notification : Geçmiş siparişleriniz yükleniyor. Lütfen kısa bir süre sonra tekrar kontrol ediniz. Teşekkürler.
'; } }); } $('#orders').html(htmlStr); $("#notification").html(refundhtmlstr); ApplySlide(); }, error: function () { console.log("System Failure"); } }); } }

Web.config

Incluya el origen de la interfaz de usuario y establezca Allow Crentials en true

         

Uno puede usar iframes invisibles para obtener las cookies. Digamos que hay dos dominios, a.com y b.com. Para el index.html del dominio a.com uno puede agregar (altura de aviso = 0 ancho = 0):

  

De esta forma, su sitio web recibirá las cookies de b.com suponiendo que http://b.com establece las cookies.

Lo siguiente sería manipular el sitio dentro del iframe a través de JavaScript. Las operaciones dentro de iframe pueden convertirse en un desafío si uno no posee el segundo dominio. Pero en caso de tener acceso a ambos dominios, la página web correcta en el src de iframe debe proporcionar las cookies que uno desea obtener.

La solución más inteligente es seguir el camino de Facebook sobre esto. ¿Cómo sabe Facebook quién eres cuando visitas un dominio? En realidad es muy simple :

El botón Me gusta realmente permite que Facebook rastree a todos los visitantes del sitio externo, sin importar si lo presionan o no. Facebook puede hacer eso porque usan un iframe para mostrar el botón. Un iframe es algo así como una ventana incrustada dentro de una página. La diferencia entre usar un iframe y una imagen simple para el botón es que el iframe contiene una página web completa: desde Facebook . No hay mucho que hacer en esta página, a excepción del botón y la información sobre a cuántas personas les ha gustado la página actual.

Entonces, cuando ve un botón similar en cnn.com, en realidad está visitando una página de Facebook al mismo tiempo. Eso le permite a Facebook leer una cookie en su computadora, que ha creado la última vez que se conectó a Facebook.

Una regla de seguridad fundamental en cada navegador es que solo el sitio web que ha creado una cookie puede leerla más adelante. Y esa es la ventaja del iframe: permite que Facebook lea tus cookies de Facebook incluso cuando estás visitando un sitio web diferente. Así es como te reconocen en cnn.com y muestran a tus amigos allí.

Fuente:

Leer Cookie en la Web Api

 var cookie = actionContext.Request.Headers.GetCookies("newhbsslv1"); Logger.Log("Cookie " + cookie, LoggerLevel.Info); Logger.Log("Cookie count " + cookie.Count, LoggerLevel.Info); if (cookie != null && cookie.Count > 0) { Logger.Log("Befor For " , LoggerLevel.Info); foreach (var perCookie in cookie[0].Cookies) { Logger.Log("perCookie " + perCookie, LoggerLevel.Info); if (perCookie.Name == "newhbsslv1") { strToken = perCookie.Value; } } }