¿Cómo puedo manejar excepciones de tiempo de espera de autenticación de formularios en ASP.NET?

Si la sesión ha expirado y el usuario hace clic en un enlace a otro formulario web, la autenticación asp.net automáticamente redirige al usuario a la página de inicio de sesión.

Sin embargo, hay casos en los que el usuario no hace clic en enlaces a otros formularios web. Por ejemplo: edite el enlace en gridviews, cuando usa AutoCompleteExtender con cuadros de texto y la aplicación intenta obtener la información, y básicamente, en todos los casos cuando se realiza una devolución de datos y el evento no es manejado automáticamente por la autenticación asp.net.

¿Cuál es la mejor manera de manejar estas excepciones?

ACTUALIZACIÓN: acabo de modificar el título de la pregunta: el tiempo de espera de autenticación de formularios, en lugar del tiempo de espera de la sesión inicial. Gracias por hacerme consciente de esta diferencia.

ACTUALIZACIÓN: Acabo de crear una nueva pregunta con el problema específico que estoy enfrentando: ¿Cómo manejar la excepción debido a un ticket de autenticación caducado usando UpdatePanel? . Sorprendentemente, no he encontrado mucha información al respecto. Realmente agradecería su ayuda.

Esta es la razón por la cual muchos sistemas incluyen temporizadores en la página para dar tiempos de espera aproximados. Esto es difícil con páginas interactivas. Realmente necesita enlazar funciones ajax y mirar el código de estado de retorno, que es un poco difícil. Una alternativa es usar un código basado en lo siguiente que se ejecuta temprano en el ciclo de vida de la página y realizar una redirección ajax a una página de inicio de sesión. De lo contrario, estás atrapado tratando de interceptar el código de retorno de ajax y en asp.net donde el ajax está hecho ‘para ti’ (es decir, no es un método más manual como jQuery) pierdes esta facilidad de detección.

http://www.eggheadcafe.com/tutorials/aspnet/7262426f-3c65-4c90-b49c-106470f1d22a/build-an-aspnet-session-timeout-redirect-control.aspx

para un truco rápido, puedes probarlo directamente en pre_init http://forums.asp.net/t/1193501.aspx

Edite lo que se necesita para los tiempos de espera de autenticación de formularios, no para los tiempos de espera de la sesión. Los tiempos de espera de autenticación de formularios operan en una escala diferente a los tiempos de espera de la sesión. Actualización de tiempos de espera de la sesión con cada solicitud. Los tickets de autenticación de formularios no se actualizan realmente hasta que pasa la mitad del tiempo. Por lo tanto, si tiene tiempos de espera configurados en una hora y envía una solicitud dentro de 25 minutos, la sesión se restablece a un tiempo de espera de una hora, el ticket de autenticación de formularios no se toca y ¡expira en 35 minutos! Para solucionar esto, sincronice el tiempo de espera de la sesión y el ticket de autenticación de formularios. De esta forma, aún puede verificar los tiempos de espera de la sesión. Si no te gusta esto, entonces sigue: haz lo siguiente y sincroniza los tiempos de espera y luego analiza el ticket de autenticación y lee su tiempo de espera. Puedes hacer eso usando FormsAuthentication.Decrypt – ver:

Lea la cookie de autenticación de formulario del código asp.net detrás

Tenga en cuenta que este código requiere que al iniciar sesión configure algún valor de sesión, en este caso su “UniqueUserId”. También cambie la ruta de la página de inicio de sesión a continuación para que se ajuste a la suya.

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) { //Only access session state if it is available if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState) { //If we are authenticated AND we dont have a session here.. redirect to login page. HttpCookie authenticationCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; if (authenticationCookie != null) { FormsAuthenticationTicket authenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value); if (!authenticationTicket.Expired) { if (Session["UniqueUserId"] == null) { //This means for some reason the session expired before the authentication ticket. Force a login. FormsAuthentication.SignOut(); Response.Redirect("Login.aspx", true); return; } } } } } 

Si usa la Autenticación de formularios, el usuario será redireccionado a la página de inicio de sesión cuando expire el ticket de autenticación de formularios, que no es lo mismo que la sesión que expira.

Podría considerar boost el tiempo de espera de Autenticación de formularios, si corresponde. Incluso en la medida de usar una cookie persistente. Pero si caduca, no hay una alternativa real a la redirección a la página de inicio de sesión; cualquier otra cosa sería inseguro.

Una forma de lidiar con los tiempos de espera de la sesión es usar la sesión como caché y persistir cualquier elemento importante para una tienda de respaldo, como una base de datos. Luego, verifique antes de acceder a cualquier cosa en la sesión y actualice si es necesario:

 MyType MyObject { get { MyType myObject = Session["MySessionKey"] as MyType if (myObject == null) { myObject = ... get data from a backing store Session["MySessionKey"] = myObject; } return myObject; } set { Session["MySessionKey"] = value; ... and persist it to backing store if appropriate } } 

Si está utilizando una página maestra o una página base, agregaría algo de lógica a uno de los eventos en el ciclo de vida de la página para verificar si la sesión es nueva:

 protected void Page_Load(object sender, EventArgs e) { if (Session.IsNewSession) { //do whatever you need to do } }