Ayer nos topamos en el trabajo con este detalle, y aunque al principio batallamos para encontrar solución, en realidad es algo sencillo.
ASP.NET utiliza un objeto HttpSessionState
para permitirnos guardar variables en una sesión, es decir, mientras el usuario está en nuestro sitio Web sin cerrar el navegador.
public void Login(string usuario, string password) { if (UsuarioValido(usuario, password)) { Session["usuario"] = usuario; } }
El objeto Session
se inicializa con un identificador único para el sistema, y puede guardar tantas variables como se requieran. El problema es cuando queremos cerrar la sesión. Limpiar las variables no es tanto problema, pero cerrar una sesión significa inicializar el objeto Session por completo.
Para cerrar la sesión correctamente, debemos hacer esto:
public void Logout() { Session.Abandon(); Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); }
HttpSessionState
tiene un método Clear()
que borra todas las variables de la sesión. El método Abandon()
cierra la sesión actual, lo cual hará que la próxima vez que se requiera una sesión, se inicialice automáticamente. No estamos usando el método Clear
porque Abandon
se encarga de limpiar la sesión.
La segunda línea de código la estamos usando para forzar el inicio de una nueva sesión, justo después de haber cerrado la anterior. El framework utiliza una cookie llamada ASP.NET_SessionId
, en la que guarda la sesión actual, por lo que tenemos que sobreescribirla, utilizando el objeto Response
para guardar la nueva. Con esto se regenera la sesión, con un nuevo identificador y sin variables. Lista para usarse desde cero.
Buen Tuto…
Ojala y me sirva .. lo probare .. he estad todo un dia buscando la solucion y naa que me ayude hasta el momento 😀
pero si das clic atras o pones la direccion entra de todas maneras
En cada página debes tener las validaciones para evitar que acceda un usuario no autorizado. En el evento Init o Load de todas las páginas, agrega la validación para que saque a los usuarios anónimos (que los envíe a la página de inicio, a la de login, o a donde sea).
Si alguien le da para atrás, es muy probable que sí le muestre la página, pues el navegador utilizará su caché (archivos temporales) en lugar de cargar de nuevo desde el servidor. Pero es precisamente eso, archivos temporales guardados en caché. Al intenar ejecutar cualquier acción, la misma aplicación validará que sea un usuario en sesión, lo cual, como dije, debe ir en uno de los eventos de carga de la página.
Como se puede programar, aun no he encotrador la solución, cuando un usuario cierra el navegador, la sesion se destruya.?
yo también estoy buscando como cerrar la sesión si el usuario pulsa la X del navegador o Alt + F4 …
buena informacion pero usar cookies como que algo ya viejo con el puro uso de session[] o application[] se puede hacer buen trabajo y con Session.Abandon() se ejecuta el metodo Session_End en global.asax siempre que timeout del webconfig se cumpla
pero muy buena info
saludos
Usad lo siguiente:
System.Web.Security.FormsAuthentication.SignOut()
Session.Abandon()
Response.Redirect(«default.aspx»)
Listo.
¥ Bitxo
Genial a me me funciono muy bien con esto ya que solo con Abandon y Response no la cerraba completamente.
Muchas gracias
Tengo un problema parecido, entro a ami aplicacion por la pagina L, mediante un link voy a la pagina A, intento poner la direccion de una pagina B en la barra de direcciones, como esta pagina verifica los privilegios del usuario me bota a la pagina L mediante un código como el mostrado de Sesion Abandon y Redirect, una vez en la pagina L «escribo en la barra de direcciones» la direccion de la Pag A y entra sin problemas y sin login, cabe mencionar que en todas las pgs de mi aplicacion está validada la sesion y el privilegio del usuario, puse un breack ponit en el «load» de la pg A y al princpio pasa por ahí pero en el 2º intento segun el orden que explique nisiquiera pasa por el Load y carga directamente la pg A mencinoada, alguna idea??
Gracias ¥Bitxo me sirvio mucho tu aporte.
Sitio en .NET 3.5
Windows Server 2008 R2
Muchas gracias me ha sido de gran utilidad