Pregunta

Mi aplicación está generando un error cuando la sesión expira.

No quiero que las sesiones expiren automáticamente ...

pero si no hay forma de hacerlo, en lugar de mostrar el error, debe ser redirigido a la página de inicio de sesión ...

Traté de hacer esto ...

Response.AppendHeader("Refresh", Convert.ToString((Session.Timeout * 60) + 10) + "; URL=Login.aspx");

este código no funciona cuando caduca la sesión ... aparece un mensaje de error

  

La respuesta no está disponible en este contexto.

la configuración web tiene esto

<authentication mode="Forms">
        <forms loginUrl="Login.aspx" name="Cookie" timeout="10080" path="/">
        </forms>
    </authentication>
    <authorization>
        <deny users="?"/>
        <allow users="*"/>
    </authorization>

¿Hay algo más que deba agregar en la configuración web ...

cualquier sugerencia ... gracias

esta es la carga de mi página

 protected void Page_Load(object sender, EventArgs e)
    {
        Response.AppendHeader("Refresh", Convert.ToString((Session.Timeout * 60) + 10) + "; URL=Login.aspx");
        string userName = Session["userName"].ToString();
        string password = Session["password"].ToString();
        string domain = Session["domain"].ToString();

        impersonateValidUser(userName, domain, password);


    }
¿Fue útil?

Solución

He resuelto esto en el Page_Load de mi página maestra.

Cada vez que se activa Page_Load se comprueba si existe un valor específico de Session (que debería estar allí si un usuario ha iniciado sesión correctamente). Si no, redirijo a la página de inicio de sesión.

Por ejemplo:

// Assuming your using master pages (if not you could have this in a base page that all
// your pages inherit from.
protected void Page_Load(object sender, EventArgs e)
{
    if (Session["SomeKey"] == null)
    {
        // Session has expired or person has not signed in so redirect.
        FormsAuthentication.SignOut();
        Session.Abandon();
        Response.Redirect("signin.aspx", true);
    }

    // If all is good continue and do whatever you normally do.
}

En su ejemplo, es posible que las variables de sesión no existan debido a que la sesión caduca, por lo que obtiene nulos de todas las claves de sesión recuperadas. Debería validar que no son nulos y, de ser así, reaccionar adecuadamente a los valores que son nulos.

Otros consejos

No estoy seguro de cuál es su problema, pero como alternativa, considere utilizar un lado del cliente con una solución de javascript para pedirle al usuario que renueve su sesión antes de que caduque. Si el usuario no acepta afirmativamente la renovación de la sesión, rediríjalo a la página Cerrar sesión para finalizar la sesión sin dejar simplemente que caduque. Normalmente, su página de cierre de sesión se redireccionará a la página de inicio de sesión, de modo que cuando el usuario regrese a su computadora, se le solicitará que inicie sesión. Si el usuario hace clic en el botón OK (quiero renovar mi sesión) en su cuadro de diálogo de renovación, use una solicitud para una página de Keepalive, como sugiere @Come, aunque lo haría con AJAX en lugar de un iframe.

Puede consultar algunos código de muestra que hace esto en un contexto de ASP.NET MVC en mi blog .

Lo que puede hacer es agregar un iframe invisible a su página:

<iframe src="keepalive.aspx" style="width:0px;height:0px"></iframe>

Y keepalive.aspx contiene lo siguiente:

<%@ Page Language="C#" Inherits="Keepalive" EnableSessionState="True"%>
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" >
<html>
  <head>
   <META http-equiv="refresh" content="60"/>
  </head>
  <body></body>
</html>

Cada 60 segundos keepalive.aspx se actualiza haciendo que la sesión se mantenga viva. Puede establecer el tiempo de espera de la sesión en, por ejemplo, 2 minutos. De esta forma, la sesión se limpiará muy pronto después de que el usuario haya abandonado su página.

Es una mala idea tener sesiones permanentes en su sitio, pero puede lograrlo dando grandes valores para el tiempo de espera de la sesión en web.config

<sessionState  timeout="6000"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top