2010-12-08 17 views
6

Estoy utilizando la autenticación ASP y el servicio web integrado.Cookie de autenticación ASP ASPXAUTH no borrada al iniciar sesión/cerrar sesión

El usuario inicia sesión con la autenticación de formularios en una página de inicio de sesión.
Para desconectarme, llamo al servicio web de autenticación de Silverlight y cierro de sesión de llamada.

Todo funcionó bien, pero ahora a veces IE se vuelve loco y ya no cierra la sesión del usuario.

Utilicé Fiddler y resulta que el servicio de autenticación devuelve un SetCookie para borrar la cookie ASPXAUTH pero en la próxima llamada IE todavía tiene el conjunto de cookies.
Así que fuera de curso porque la cookie está allí, el usuario está autenticado y vuelve a iniciar sesión en lugar de ser dirigido a la página de inicio de sesión.

Lo revisé y no vi ninguna otra descripción del problema. No puedo reproducirlo y mis colegas que tienen un IE que funciona mal lo tienen funcionando bien en un entorno y no en el otro (uno tiene el problema para DEV y otro tiene el problema para el servidor de PreProd).

¿Alguna idea de lo que puede estar pasando?

+0

Un problema común es que la cookie se establece en un contexto e intenta ser eliminada de otra. P.ej. asegúrese de que los atributos de ruta y dominio en el encabezado de eliminación de Set-Cookie coincidan exactamente con los de la llamada de Set-Cookie original. – EricLaw

+0

Desafortunadamente, como dije, no tengo control sobre eso. Llamo a FormsAuthentication.RedirectFromLogin para configurar la cookie y llamar al método LogOut del servicio web. – R4cOON

Respuesta

2

Para evitar este problema, en el momento en que realiza el inicio de sesión, la próxima llamada debe realizarse con Redirigir (pageLogOut, verdadero); y detenga cualquier otra actividad hasta que se redirija por completo. El parámetro verdadero es muy importante.

Después de llamar a SignOut(), debe forzar al navegador a eliminar los datos de las cookies porque si autentica solicita nuevamente la cookie por alguna razón la cookie obtiene más tiempo de vida y no la elimina del navegador como lo pides con el comando SigntOut.

Luego del inicio de sesión, realice un redireccionamiento a una página, o asegúrese de enjuagar las cookies en el navegador y no volver a preguntar nada que tenga que ver con la autenticación del usuario hasta que las cookies estén totalmente escritas. navegador.

Espero que esta ayuda.

+0

MSDN recomienda redirigir con falso y luego llamar a CompleteRequest para evitar ThreadAbortException. Mencionan el rendimiento también, pero no lo he probado. Desde [MSDN - Response Redirect] (http://msdn.microsoft.com/en-us/library/a8wa7sdt.aspx): si especifica true para el parámetro endResponse, este método llama al método End para la solicitud original, que lanza una excepción ThreadAbortException cuando se completa. Esta excepción tiene un efecto perjudicial en el rendimiento de la aplicación web, por lo que se recomienda pasar falso para el parámetro endResponse. –

+0

@CharlesByrne Si no detiene el procesamiento, es posible que se escriban más cookies en los navegadores, cookies que no espera. - tómate un momento y lee esto http://stackoverflow.com/a/14641145/159270 – Aristos

+0

esta no es una buena recomendación general para hacer ... o usar ... si las cookies se escriben en la respuesta en otro lugar, entonces ese problema debería ser ser abordado, no trabajado. –

4

tuve este problema, y ​​para asegurarse, el usuario obtiene la sesión, ahora utilizo el siguiente fragmento de código:

 FormsAuthentication.SignOut(); 

     // Drop all the information held in the session 
     Session.Clear(); 
     Session.Abandon(); 

     // clear authentication cookie 
     HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, ""); 
     cookie1.Expires = DateTime.Now.AddYears(-1); 
     Response.Cookies.Add(cookie1); 

     // clear session cookie 
     HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", ""); 
     cookie2.Expires = DateTime.Now.AddYears(-1); 
     Response.Cookies.Add(cookie2); 

     // Redirect the user to the login page 
     Response.Redirect("YourLoginPage.aspx", true); 
+0

Esto funciona. Tuve un problema donde el código asp: LoginStatus no funcionaba correctamente, pero me redireccionaba a logon.aspx, así que pegué este código en esa función page_init y probé el inicio de sesión por if (Context.User.Identity.IsAuthenticated) - en ese momento señalar que las cookies se enjuagaron correctamente { – Rob

0

Es probable que el problema que eras experiencia fue en lo que respecta al dominio de las cookies . La cookie puede escribirse en "." + FormsAuthentication.CookieDomain. He configurado cookies para el dominio "admin.example.com" anteriormente, y he visto la cookie antepuesta con .. En el entorno de desarrollo, está escrito en localhost

La solución que uso es agregar dos cookies para cada cookie de autenticación y sesión.

Así que la solución que estoy usando es como sigue:

protected void SignOut(HttpContext Context) 
    { 
     FormsAuthentication.SignOut(); 
     Context.Session.Abandon(); 

     // clear authentication cookie 
     Context.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName) 
     { 
      Path = FormsAuthentication.FormsCookiePath, 
      Value = "", 
      Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? Convert.ToString(FormsAuthentication.CookieDomain) : Context.Request.Url.Host, 
      HttpOnly = true, 
      Expires = DateTime.Now.AddYears(-1) 
     }); 

     Context.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName) 
     { 
      Path = FormsAuthentication.FormsCookiePath, 
      Value = "", 
      Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? "." + Convert.ToString(FormsAuthentication.CookieDomain) : "." + Context.Request.Url.Host, 
      HttpOnly = true, 
      Expires = DateTime.Now.AddYears(-1) 
     }); 

     // clear session cookie (not necessary for the current problem but recommended anyway) 

     Context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId") 
     { 
      Path = FormsAuthentication.FormsCookiePath, 
      Value = "", 
      Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? Convert.ToString(FormsAuthentication.CookieDomain) : Context.Request.Url.Host, 
      HttpOnly = true, 
      Expires = DateTime.Now.AddYears(-1) 
     }); 


     Context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId") 
     { 
      Path = FormsAuthentication.FormsCookiePath, 
      Value = "", 
      Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? "." + Convert.ToString(FormsAuthentication.CookieDomain) : "." + Context.Request.Url.Host, 
      HttpOnly = true, 
      Expires = DateTime.Now.AddYears(-1) 
     }); 


     FormsAuthentication.RedirectToLoginPage(); 
    } 

El resultado de esta convocatoria se sumarán los siguientes encabezados en la respuesta

Ubicación: /Login.aspx? ReturnUrl = Predeterminado.aspx

Set-Cookie: **** =; vence = martes, 12 de octubre de 1999 a las 05:00:00 GMT; ruta = /; HttpOnly

Set-Cookie: **** =; domain = admin.example.com; expira = mié, 23-abr-2014 18:04:58 GMT; ruta = /; HttpOnly

Set-Cookie: **** =; domain = .admin.example.com; expira = mié, 23-abr-2014 18:04:58 GMT; ruta = /; HttpOnly

Set-Cookie: ASP.NET_SessionId =; domain = admin.example.com expira = mié, 23-abr-2014 18:04:58 GMT; ruta = /; HttpOnly

Set-Cookie: ASP.NET_SessionId =; domain = .admin.example.com expira = mié, 23-abr-2014 18:04:58 GMT; ruta = /; HttpOnly

Dónde *** es el nombre de mi galleta que contiene el valor de mi vale de autenticación cifrada;


Tenga en cuenta que la primera Set-Cookie es probable generan a partir de la llamada FormsAuthentication.SignOut() método.

Cuestiones relacionadas