asp.net - tiempo - session timeout asp
Detección de tiempo de espera de sesión de ASP.Net: ¿La detección de Session.IsNewSession y SessionCookie es la mejor manera de hacerlo? (2)
Cuando mi sesión de ASP.Net termina el tiempo de espera (y también forma la autenticación) e intento acceder a una página, me redirigen automáticamente a mi página predeterminada de login.aspx.
Antes de que se cargue la página, necesito determinar si esta es una situación de tiempo de espera y, de ser así, redireccionar a timeout.aspx.
Los siguientes artículos especifican que si IsNewSession es verdadero y existe una cookie sessionID, entonces tiene una situación de tiempo de espera excedido.
Sin embargo, en mis pruebas tengo la situación en la que agoto el tiempo de espera e intento volver a iniciar sesión y IsNewSession es igual a true y la cookie sessionId todavía está dando vueltas (porque permanece para toda una sesión del navegador), por lo tanto dice que he sincronizado -out nuevamente cuando intento volver a iniciar sesión
¿Hay una mejor manera de hacer todo esto?
La técnica se describe aquí y aquí .
En mi archivo ''global.asax'' tengo:
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
// Check if session state is enabled in web.config
if (Context.Session == null) return;
if (Session["user"] == null)
{
if (Session.IsNewSession)
{
HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"];
if ((null != sessionCookie) && !string.IsNullOrEmpty(sessionCookie.Value))
{
/* Session Timeout! */
FormsAuthentication.SignOut(); //just in case not done yet
Session.Abandon();
Response.Redirect("timeout.aspx");
}
else
{
// Cookie didn''t exist - must be a brand new login
return;
}
}
else
{
// If there is no session data and the session is not new then it must be the postback of the login screen.
if ((HttpContext.Current.Request.Path.ToLower().LastIndexOf("/login.aspx") >= 0) && (Request.HttpMethod == "POST"))
{
return;
}
}
}
}
¿Está tratando de distinguir entre una sesión de tiempo de espera y una sesión que fue abierta manualmente?
Su problema es que debido a que los datos de la sesión han desaparecido, todo lo que tiene que hacer es que una nueva solicitud haya creado una nueva sesión y que la solicitud contenga una cookie de identificación de sesión (lo que indica que ya se había conectado).
Hay dos enfoques.
Galleta:
Primero, en su página de inicio de sesión, puede crear una cookie adicional que indique el estado de inicio de sesión del usuario. Cuando el usuario cierra sesión manualmente, el valor de la cookie se modifica para indicar el cierre de sesión. Una solicitud después de que una sesión haya IsNewSession
además de tener IsNewSession
true, también tendrá una cookie de estado de inicio de sesión que muestra que el usuario todavía está conectado, lo que indica que el usuario no ha elegido cerrar la sesión manualmente.
Base de datos:
Un segundo enfoque es almacenar los ID de sesión en una tabla DB junto con el estado de inicio de sesión. Cuando un inicio de sesión es exitoso, ingrese el ID de sesión en una tabla LoggedOnSessions. Cuando el usuario cierra sesión manualmente, elimine el ID de sesión de la tabla. Por lo tanto, su detección de tiempo de espera puede incluir una búsqueda de la ID de la sesión en la tabla, si está presente, fue un tiempo de espera (en este punto, probablemente también deba eliminar la ID).
Para fines de mantenimiento, debe incluir un campo de fecha y hora de caducidad que se establece durante mucho más tiempo que cualquier período de inicio de sesión realista (por ejemplo, una semana). De forma regular (por ejemplo, semanalmente) elimine las entradas en la tabla que hayan expirado.
Mi preferencia es el enfoque de la base de datos Odio establecer cookies porque me molesta que esa cookie se envíe con cada solicitud, pero rara vez se necesita.
También puede buscar en su archivo web.config debajo de la autenticación de etiqueta. Esto debería verse más o menos así:
<authentication mode="Windows">
<forms defaultUrl="Default.aspx" loginUrl="Login.aspx" name=".aspxAuth">
</forms>
</authentication>
Observe el modo de atributo, probablemente dice Formularios en lugar de Ventana en su archivo web.config. En este caso, si pierde su sesión y luego hace clic en cualquier enlace (digamos SalesChart.aspx), ASP.NET lo llevará directamente a Login.aspx codebehind en lugar de SalesChart.aspx codebehind, que es particularmente molesto.
Si prueba el modo Windows, se lo llevará a la página solicitada (SalesChart.aspx) cada vez, y luego decidirá por su cuenta qué acción tomar si se pierde la sesión.