8

Tengo el siguiente código en una página de inicio de sesión. Estoy usando esto para establecer el tiempo de espera de inicio de sesión por cliente. En IE8 me encuentro con el problema de que si un usuario abre otra ventana del navegador, luego se desconecta en la primera ventana, cuando vuelven a entrar, se recuperan al inicio de sesión después de una sola página (cada vez). Si no abren otro navegador, todo está bien.Autenticación de formularios IE8 y ASP.Net Las cookies fallan al abrir varios navegadores

He encontrado MUCHAS preguntas sobre esto, pero la única solución que he encontrado que funciona es usar el método sin cookies (URI).

He visto algunos artículos que dicen que debo configurar el dominio, lo cual estoy haciendo, pero eso no funciona. Además, he intentado configurar el Authticket tanto persistente como no persistente. Ninguno de los dos ha hecho la diferencia. He visto que una vez que la cookie de autenticación se ha ido de la carpeta, no se vuelve a crear cuando inicio sesión.

Si abro esa segunda ventana del navegador como una "Nueva sesión" no tengo ningún problema. (Esto no es práctico, ya que no podemos capacitar a todos los usuarios de la aplicación para abrir ventanas adicionales de esta manera.)

¿Hay alguna solución que alguien haya encontrado que no implique el uso del enfoque de URI sin cookies?

int timeoutValue = 20 // This value is actually returned from a method; 

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(LoginControl.UserName, false, timeoutValue);    
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);     
authCookie.Domain = "my.domain"; 
authCookie.Expires = DateTime.Now.AddMinutes(timeoutValue); 

HttpContext.Current.Response.Cookies.Add(authCookie); 
+0

aclarar: ¿el usuario abre una nueva ventana del navegador desde la aplicación? es decir, haga clic con el botón derecho en> abrir el enlace en una nueva ventana, lo que implica extender la sesión a la nueva ventana. –

+0

Sí, pero no importa cómo abran la segunda ventana. Si comienzan un nuevo navegador desde un acceso directo de escritorio, pestaña nueva, haga clic con el botón derecho. La única forma que no causa el problema es "Archivo ... Nueva sesión" – Mikejh99

+0

En realidad, permítanme repetir eso. Si inicio el navegador original desde un acceso directo en el escritorio, no tengo el problema. Creo que esto tiene algo que ver con la forma en que IE está lanzando, con -nomerge o algo así. – Mikejh99

Respuesta

3

Esta es una "característica" de Internet Explorer para compartir cookies/sesión a través de las ventanas del navegador. De ahí la nueva "función" para crear una "Nueva sesión" en IE8. Por lo tanto, no creo que haya una forma ideal de detener fácilmente este comportamiento.

Aparte de ir sin cookies, por supuesto.

2

Sé que esta es una vieja pregunta, pero he estado batallando con el mismo problema y creo que tengo una solución. He replicado estos síntomas exactos y también he podido eliminarlos con éxito (al menos hasta ahora).

Solo poner una caducidad en la cookie si desea un ticket de autenticación persistente me está eliminando el problema.

Aquí es mi método tal como está ahora:

internal static void CreateAuthenticationCookie(string userName, bool rememberMe, bool expired = false) 
{ 
    int timeout = expired ? -1440 : (rememberMe ? 43200 : 20); // Timeout in minutes, 525600 = 365 days, 1440 = 1 day. 
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(timeout), rememberMe, string.Empty); 
    string encrypted = FormsAuthentication.Encrypt(ticket); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted); 

    if (rememberMe) 
     cookie.Expires = System.DateTime.Now.AddMinutes(timeout); 

    HttpContext.Current.Response.Cookies.Add(cookie); 
} 

Y aquí es como yo lo llamo:

if(createPersistentCookie) 
    CreateAuthenticationCookie(userName, createPersistentCookie); 
else 
    FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

Soy consciente de que por la manera en que yo estoy llamando, no hay necesidad para el parámetro "recordarme" en el método CreateAuthenticationCookie (dado que en este caso siempre soy cierto), pero no lo he refactorizado todavía y demuestra mejor cómo alguien más puede querer usarlo.

Yo quería una manera de tener fácilmente una caducidad móvil si el usuario decidía no "recordarme", pero si escogían "recordarme" no quería limitarme al tiempo de espera de 30 minutos de mi no usuarios "recordarme". Mi propósito era que si alguien está usando una computadora pública obtienen la expiración deslizante además de no recordarme, pero si están usando una computadora personal, pueden "recordarme" y no estar limitados por la configuración de tiempo de espera en el web.config. No sé si todo esto se aplica a su situación, pero espero que ayude a alguien o que mi metodología pueda generar algunas críticas constructivas para que pueda hacer ajustes si es necesario.

PS. Aquí están mi web.Configuración de configuración para autenticación de formularios:

<authentication mode="Forms"> 
     <forms loginUrl="~/Account/LogOn" timeout="30" slidingExpiration="true"/> 
</authentication> 
Cuestiones relacionadas