Tenemos una aplicación ASP.NET MVC interna que requiere un inicio de sesión. Iniciar sesión funciona muy bien y hace lo que se espera. Tenemos una sesión de vencimiento de 15 minutos. Después de estar sentado en una sola página durante ese período de tiempo, el usuario ha perdido la sesión. Si intentan actualizar la página actual o buscar otra, obtendrán una página de inicio de sesión. Mantenemos su solicitud almacenada para que una vez que hayan iniciado sesión puedan continuar a la página que han solicitado. Esto funciona genialASP.NET MVC Expiración de la sesión
Sin embargo, mi problema es que en algunas páginas hay llamadas AJAX. Por ejemplo, pueden completar parte de un formulario, deambular y dejar que expire su sesión. Cuando vuelven, la pantalla todavía se muestra. Si simplemente completan una casilla (que hará una llamada AJAX), la llamada AJAX devolverá la página de Inicio de sesión (dentro de cualquier div que el AJAX debería haber devuelto simplemente los resultados reales). Esto se ve horrible.
Creo que la solución es hacer que la página caduque (de modo que cuando una sesión finaliza, automáticamente se devuelven a la pantalla de inicio de sesión sin ninguna acción de ellos). Sin embargo, me pregunto si hay opiniones/ideas sobre la mejor manera de implementar esto específicamente con respecto a las mejores prácticas en ASP.NET MVC.
Actualización:
Así que siguió adelante e implementado esta en mi OnActionExecuting
(por sugerencia de Keltex)
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.Write("Invalid session -- please login!");
filterContext.HttpContext.Response.End();
}
else
{
...
}
}
Esto definitivamente hace las cosas mejor - ahora incluso si tienen dos pestañas (una con algunas llamadas AJAX que pueden desencadenar) y se desconectan de forma explícita en la segunda pestaña, inmediatamente obtendrán algo que tiene más sentido en lugar de un montón de datos AJAX estropeados.
Todavía creo que implementaré la cuenta regresiva de Javascript, así como sugirió womp.
@Andrew - Esa es una solución elegante. Alernatively, would filterContext.HttpContext.Response.Redirect ("/ error/xxx"); (o algo) trabajo? – Keltex
@Keltex: puedo moverlo a una vista como sugieres, pero en muchas de mis llamadas AJAX, devuelven datos brutos (como una lista de valores) sin HTML, mientras que en otros pueden devolver una tabla completa de datos muy formateados.Por lo tanto, un "mínimo común denominador" de solo datos en bruto puede funcionar mejor. Jugaré con eso. –