una por pasar parametros pagina otro otra net formulario datos como asp c# cookies cross-browser

c# - por - Cookies con y sin el dominio especificado(incoherencia del navegador)



pasar de una pagina a otra en asp net c# (2)

Me di cuenta de que hay algunas inconsistencias reales entre los navegadores en términos de cookies.

Esto va a ser bastante largo, así que tengan paciencia conmigo.

Nota: He configurado un dominio en mi archivo de host llamado "testdomain.com", este error no funciona cuando se usa "localhost".

Nota 2: Tengo curiosidad por saber cómo funciona esto en Apache / PHP si al recuperar una cookie por nombre devuelve una colección de cookies.

Wikipedia

Wikipedia afirma que: http://en.wikipedia.org/wiki/HTTP_cookie#Domain_and_Path

Dominio y ruta
El dominio y la ruta de la cookie definen el alcance de la cookie: le dicen al navegador que las cookies solo deben enviarse al servidor para el dominio y la ruta especificados. Si no se especifica, se predeterminan al dominio y la ruta del objeto que se solicitó.

Entonces, si presionamos hacia abajo:

Response.Cookies.Add(new HttpCookie("Banana", "2") { });

Deberíamos obtener una cookie con el dominio utilizado como dominio del objeto solicitado, en este caso debería ser "testdomain.com".

W3

W3 establece en la especificación para cookies: http://www.w3.org/Protocols/rfc2109/rfc2109

Dominio = dominio

Opcional. El atributo de dominio especifica el dominio para el que la cookie es válida. Un dominio explícitamente especificado siempre debe comenzar con un punto.

Entonces, si presionamos hacia abajo:

Response.Cookies.Add(new HttpCookie("Banana", "1") { Domain = Request.Url.Host });

Empujamos hacia abajo el nombre de host explícitamente, deberíamos obtener un nombre de dominio establecido en la cookie que estaría precedido por el punto, en este caso debería ser ".testdomain.com".

También dice lo que hay en la Wikipedia:

El dominio está predeterminado en el host de solicitud. (Tenga en cuenta que no hay punto al comienzo de request-host).

Conmigo hasta ahora?

Si utilizo el primer método, definir un dominio:

Response.Cookies.Add(new HttpCookie("Banana", "1") { Domain = Request.Url.Host });

Este es el resultado:

IE9: 1 cookie

Opera: 1 cookie

Firefox: 1 cookie

Chrome: 1 cookie

Como puede ver, tanto Opera como IE establecen un dominio EXPLICITO sin el prefijo de punto.

Tanto Firefox como Chrome establecen el dominio EXPLICIT con un prefijo de punto.

Si utilizo el siguiente código:

Response.Cookies.Add(new HttpCookie("Banana", "2") { });

IE / Opera: Ambos tienen exactamente el mismo resultado, el dominio SIN el prefijo de punto.

Curiosamente, Firefox y Chrome crean cookies SIN el prefijo de punto.

(Borré todas las cookies y volví a ejecutar el código)

Firefox:

Cromo:

BIT INTERESANTE

Aquí es donde se pone interesante. Si escribo las cookies una tras otra como esta:

Response.Cookies.Add(new HttpCookie("Banana", "1") { Domain = Request.Url.Host }); Response.Cookies.Add(new HttpCookie("Banana", "2") { });

PERSONALMENTE, esperaría que existiera una cookie en el navegador, porque supongo que está basada en el nombre de la cookie.

Esto es lo que he observado:

En IE / Opera, el ÚLTIMO conjunto de cookies es la cookie que se utiliza. Esto se debe a que el nombre de la Cookie y el nombre de dominio son idénticos.

Si define explícitamente un nombre de dominio con un punto, ambos navegadores seguirán viendo 1 cookie, la última cookie del mismo nombre.

Chrome y Firefox, por otro lado, ven más de 1 cookie:

Escribí el siguiente JavaScript para volcar los valores a la página:

<script type="text/javascript"> (function () { var cookies = document.cookie.split('';''); var output = ""; for (var i = 0; i < cookies.length; i++) { output += "<li>Name " + cookies[i].split(''='')[0]; output += " - Value " + cookies[i].split(''='')[1] + "</li>"; } document.write("<ul>" + output + "</ul>"); })(); </script>

Estos son los resultados:

IE - 2 cookies establecidas (el navegador ve 1):

Opera - 2 cookies establecidas (el navegador ve 1):

Firefox - ¡2 cookies configuradas y el navegador ve 2 !:

Chrome: ¡2 cookies configuradas y el navegador muestra 2 !:

Ahora probablemente se esté preguntando si todo esto es así.

Bien:

  1. Cuando accede a la cookie por Nombre en C #, le da 1 cookie. (la primera cookie que tiene ese nombre)
  2. El navegador envía TODAS las cookies al servidor
  3. El navegador no envía información que no sea la clave / valor de la cookie. (Esto significa que el servidor no se preocupa por el dominio)
  4. Puede acceder a ambas cookies del mismo nombre, si las recupera por índice

El problema...

Tuvimos que cambiar nuestra Autenticación para especificar el dominio en la cookie cuando lo presionamos hacia abajo.

Esto rompió Chrome y Firefox, los usuarios ya no podían iniciar sesión, porque el servidor intentaba autenticar la antigua cookie de autenticación. Esto se debe a que (desde mi punto de vista) utiliza el nombre de la cookie de autenticación para recuperar la cookie.

Aunque hay dos cookies, la primera se recupera, que es la anterior, la autenticación falla, el usuario no inicia sesión. A VECES, la cookie correcta es la primera en la lista, y la autenticación tiene éxito ...

Inicialmente resolvimos esto presionando una cookie con el dominio anterior para caducar. Esto funcionó en Chrome y Firefox.

Pero ahora rompió IE / Opera ya que a ambos navegadores no les importa el dominio y solo compara la cookie en función del nombre.

Mi conclusión es que el dominio de una cookie es una total pérdida de tiempo.

Suponiendo que debemos especificar el dominio, y no podemos confiar en que los usuarios borren su caché del navegador. ¿Cómo podemos resolver este problema?

Actualizar:

Profundizando en cómo .NET firma la salida de un usuario.

if (FormsAuthentication._CookieDomain != null) { httpCookie.Domain = FormsAuthentication._CookieDomain; }

Parece que es completamente posible que la autenticación de Forms impulse una cookie de autenticación vencida, que no está relacionada con la cookie con la que el usuario está autenticado. No usa el dominio actual de Auth Cookie.

Que no puede usarse de todos modos, ya que el dominio no se envía al servidor con la cookie.

Actualización 2

Parece que FormsAuthentication está realmente roto. Si utiliza un nombre de dominio explícito en una cookie cuando autentica al usuario, espera a que la sesión expire, luego actualiza la página, el método de generación de la cookie utilizada por FormsAuthentication da como resultado que el dominio sea nulo y el navegador asigne un dominio sin puntos.

Requiere que a Forms se le asigne un dominio por adelantado para que se le asigne a la cookie, esto rompe un sistema multi-tenant ...


La sugerencia de @WilliamBZA ayudó a resolver el problema inicial, pero luego el error de tiempo de espera de registro / sesión que da como resultado que la cookie crear una cookie de dominio implícita me haya hecho llegar a la conclusión de que la solución es ...

No use cookies explícitas en .NET ... alguna vez

Hay demasiados problemas, seguros de que pueden resolverse explicitando en el Formulario / Dominio, Cookie / Dominio, etc. Para garantizar que el dominio correcto se use en todas partes. Pero si su aplicación aloja múltiples dominios o es multi inquilino, entonces simplemente se vuelve demasiado problemático.

La lección es aprendida No use cookies explícitas.


No puedo evitar el por qué las cookies se tratan de manera diferente, pero una solución rápida sería usar un nombre de cookie diferente por sub-aplicación en lugar de usar el dominio de la cookie.

En el caso de la Autenticación de formularios, cambie el nombre de la cookie ASPXAUTH.