2010-04-05 10 views
9

Tengo un extraño capricho con cookies en IE. Cuando un usuario inicia sesión en el sitio, estoy generando un nuevo ID de sesión y, por lo tanto, necesito sobrescribir la cookie. El flujo es básicamente:Cookie no renovar/sobrescribir en IE

  1. cliente va a https://secure.example.com/users/login página, recibir automáticamente un identificador de sesión
  2. POST cliente credenciales de acceso a la misma dirección
  3. cliente recibe los siguientes encabezados Set-Cookie junto con una redirección 302 a https://secure.example.com/users/mypage:

    CAKEPHP = eliminado; expira = dom, 05-abr-2009 04:50:35 GMT; ruta =/
    CAKEPHP = 98hnIO23 ...; expira = Lun, 12 de abril de 2010 04:50:36 GMT; ruta = /; asegurar

  4. cliente se supone que debe visitar https://secure.example.com/users/mypage, presentando el nuevo identificador de sesión.

Esto funciona en todos los navegadores, excepto IE (probado en 7 & 8). IE conserva la identificación de sesión antigua, no autenticada, y se redirige a la página de inicio de sesión. Funciona en mi entorno de prueba local (utilizando un certificado autofirmado en https://localhost:8443/...), pero no en el servidor activo.

estoy usando CakePHP y simplemente emitir una $this->Session->renew(), que produce las cabeceras de cookies anteriores.

Alguna idea de cómo conseguir IE para aceptar la nueva cookie?


Aquí está la cabecera completa:

HTTP/1.0 302 Moved Temporarily 
Date: Thu, 08 Apr 2010 02:54:30 GMT 
Server: Apache 
Expires: Mon, 26 Jul 1997 05:00:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM" 
Set-Cookie: CAKEPHP=deleted; expires=Wed, 08-Apr-2009 02:54:30 GMT; path=/ 
Set-Cookie: CAKEPHP=d55c...; expires=Thu, 15 Apr 2010 02:54:31 GMT; path=/; secure 
Last-Modified: Thu, 08 Apr 2010 02:54:30 GMT 
Location: https://secure.example.com/users/mypage 
Vary: Accept-Encoding 
Content-Length: 0 
Connection: close 
Content-Type: text/html; charset=utf-8 

Creo que he encontrado el problema: IE está enviando dos galletas de nombre idéntico. Aquí está la siguiente petición al servidor:

GET /users/mypage HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, */ * 
Referer: https://secure.example.com/users/login 
Accept-Language: en-gb 
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322) 
Accept-Encoding: gzip, deflate 
Host: secure.example.com 
Connection: Keep-Alive 
Cache-Control: no-cache 
Cookie: CAKEPHP=19c6...; CAKEPHP=d55c... 

en cuenta que se envía dos galletas, el que recibió después de iniciar la sesión, sino también a la antigua. Recibió el anterior en la página principal example.com, establecido con path=/. También lo está enviando para solicitudes al secure.example.com. No se reemplaza por el encabezado anterior, sino que lo agrega como una cookie adicional. ¿Cómo puedo evitar que haga eso?

+0

¿Quizás intente eliminar específicamente la cookie anterior antes de crear la nueva? –

+0

@David, pensé que eso es lo que estoy haciendo. ¿De qué otra manera podría hacer eso en el mismo encabezado? – deceze

Respuesta

3

Asegúrese de que las galletas se emiten para su dominio base.

Eso es v. Probable es que el problema, ya que este comportamiento ciertamente varía en diferentes navegadores.

no he hecho en cakephp, pero this should work

+0

Sí, ese era el problema. Agregué 'ini_set ('session.cookie_domain', '.example.com')' a través del método vinculado. ¡Gracias! – deceze

+2

¡El enlace está muerto! –

4

Un problema común es que el segundo intento de establecer la cookie carece de una cabecera P3P adecuada y por lo tanto el intento de tocar la cookie se ignora.

Sería de gran ayuda si usted envió las cabeceras del flujo global (por ejemplo, utilizar Fiddler para capturar y buscar)

+0

Después de jugar con Fiddler creo que encontré la raíz del problema, por favor eche un vistazo a la pregunta nuevamente. – deceze

+2

El problema típico cuando tiene dos cookies del mismo nombre es que establece la misma cookie con dos atributos PATH diferentes, o establece la misma cookie con dos atributos de DOMINIO diferentes. Esto último a menudo ocurre cuando un usuario visita su sitio como //example.com y luego lo visita como //www.example.com. Si su sitio no tiene cuidado de redirigir siempre a www.example.com sin configurar una cookie, usted termina con dos. Debido a la naturaleza de la herencia del dominio de cookies, ambos se envían cuando visita www.example.com. La forma más simple de verificar? Visita //example.com y mira! – EricLaw

+0

Al leer su pregunta más de cerca, me parece que ya sabe que este es el problema. Para solucionarlo, agregue el atributo DOMAIN = example.com a todos sus encabezados de respuesta SET-COOKIE. – EricLaw

2

Es posible que tenga dos cuestiones.Primero, ingrese el enlace en @freddy-rios publicando un plano. Si eso no funciona, entonces es posible que experimente el IE "error de redirección de cookies".

IE no siempre respeta la modificación de cookies durante la redirección. Si asigna una ID de sesión en el formulario de inicio de sesión y no la modifica, la redirección debería funcionar bien. Si está alterando una cookie en la redirección, probablemente terminará con la sesión anterior ... el navegador simplemente enviará la cookie anterior a la nueva URL (posiblemente, lo que se supone que debe hacer ... redirigir la solicitud original))

Hay varias formas de solucionar esto. El más feo, de lejos, es usar un redireccionamiento de etiqueta de JavaScript o META. Siempre que pase un no 300 con esas cookies, el navegador las aceptará casi siempre.

Si está utilizando $this->Session->renew(), simplemente eliminarlo puede resolver todos sus problemas ... especialmente si llama al session_regenerate_id() debajo del capó.

Sugeriría quitar la redirección y ver si todavía hay un problema. Si es así, entonces puedes ignorar todo lo que dije. :)