2008-09-26 48 views
12

Actualmente estoy trabajando en una aplicación web que utiliza el marco ASP.NET 2.0. Necesito redireccionar a cierta página, decir SessionExpired.aspx, cuando la sesión del usuario expira. Hay muchas páginas en el proyecto, por lo que agregar código a cada página del sitio no es realmente una buena solución. Aunque tengo MasterPages, que creo que podría ser útil.¿Cómo puedo redireccionar a una página cuando caduque la sesión del usuario?

Gracias!

Respuesta

5

Puede manejar esto de global.asax en caso Session_Start. Puede verificar una cookie de sesión en la solicitud allí. Si existe la cookie de sesión, la sesión ha expirado:

public void Session_OnStart() 
    { 
     if (HttpContext.Current.Request.Cookies.Contains("ASP.NET_SessionId") != null) 
     { 
      HttpContext.Current.Response.Redirect("SessionTimeout.aspx") 
     } 

    } 

Por desgracia no he encontrado ninguna manera elegante de averiguar el nombre de la cookie de sesión.

+0

He aceptado esta respuesta porque la clave para identificar una sesión expirada es verificar si existe la cookie de sesión cuando se trata de una nueva sesión. –

+0

Lamentablemente, no hay una buena manera de obtener el nombre de la cookie de sesión porque no se puede hacer "Session.CookieName" como se puede con FormsAuthneticationTicket. La mejor recomendación que he encontrado es solo tener una clave/valor de AppSetting que contenga el nombre de la Cookie de sesión. Así que lo configurará dos veces, lo que a nadie le gusta hacer, pero parece ser la forma más conveniente de hacerlo. Solo mis dos centavos. – dyslexicanaboko

5

Normalmente agrego un control HtmlMeta a la colección Page.Header.Controls en la página maestra cuando el usuario ha "iniciado sesión". Establézcalo en Actualizar a su página SessionExpired.aspx con una duración de tiempo de espera adecuada, y listo.

+0

¿Qué pasa si la sesión caduca debido a cualquier otra razón que el tiempo de espera? es posible? –

+0

La caducidad implica tiempo de espera. Puede perder la sesión mediante programación (Session.Abandon()) o si el usuario manipuló o eliminó su cookie de sesión, pero en ese momento la sesión realmente no * expiró *, per se. Tal vez no estoy entendiendo el problema por completo ... –

+0

¿Qué pasa si el usuario pasa mucho tiempo en la misma página haciendo cosas que utilizan ajax en lugar de cosas GET/POST estándar? con este método, aún podrán cerrar la sesión. – coalvilledave

2

La otra forma es decirle al navegador que se redirija (mediante javascript) después de un cierto período de tiempo ... pero que siempre puede ser desactivado por el usuario.

0

Añadir o actualizar el archivo web.config para incluir esto o algo similar:

<customErrors defaultRedirect="url" mode="RemoteOnly"> 
    <error statusCode="408" redirect="~/SessionExpired.aspx"/> 
</customErrors> 
4

Si he entendido bien, los incendios "Session_End" internamente y no tiene un contexto HTTP asociada a ella:

http://forums.asp.net/t/1271309.aspx

Por lo tanto, no creo que pueda usarlo para redirigir al usuario. He visto que otros sugieren el uso de la "Session_OnStart()" evento en el archivo global.ascx:

http://forums.asp.net/p/1083259/1606991.aspx

Yo no lo he probado, pero poniendo el siguiente código en "global.ascx" podría funcionar para que:

void Session_OnStart() { 
    if (Session.IsNewSession == false) 
    { 
    } 
    else 
    { 
     Server.Transfer("SessionExpired.aspx", False); 
    } 
} 
1

no se puede redirigir al usuario cuando la sesión caduca porque no hay petición del navegador para redirigir:

  • Si el usuario visita su sitio dentro del tiempo de espera de la sesión (20 minutos por defecto), la sesión no ha finalizado, por lo tanto, no es necesario que los redireccione.
  • Si el usuario visita su sitio una vez que la sesión ha expirado, la sesión ya ha finalizado. Esto significa que estarán en el contexto de una nueva sesión: Session_OnEnd ya habrá disparado para la sesión anterior y en su lugar obtendrá Session_OnStart para la nueva sesión.

Aparte de un elemento de cliente (por ejemplo JavaScript temporizador, etc.), por lo que necesita para controlar la redirección en un lugar Session_OnStart - pero es evidente que es necesario distinguir esto de alguien que viene al sitio nuevo. Una opción es establecer una cookie de sesión cuando comienza su sesión (es decir, una cookie sin vencimiento para que solo dure hasta que se cierre el navegador), luego busque esa cookie en Session_OnStart; si está presente, se trata de un usuario recurrente con un vencimiento sesión, si no es un nuevo usuario.

Obviamente, todavía puede usar Session_OnEnd para poner en orden desde el lado del servidor; es solo la interacción del cliente que no está disponible para usted.

1

¿Está poniendo algo en el objeto Session que siempre debería estar allí?En otras palabras, si abren una sesión, se le puede poner algo así como identificación de usuario en la sesión

Session("UserID") = 1234 

lo tanto, si ese es el caso, entonces se podría añadir algo a su código subyacente de la página maestra que comprueba que valor. Algo como esto:

Dim UserID As Integer = 0 
Integer.TryParse(Session("UserID"), UserID) 

If UserID = 0 Then 
    Response.Redirect("/sessionExpired.aspx") 
End If 
+0

Mmmm ... eso casi funciona. Pero tengo un problema. Los usuarios no inician sesión. En cambio, se usa la autenticación de Windows. De todos modos, estoy usando esta solución con un redireccionamiento a la página principal mientras encuentro una solución final. –

3

Usamos la autenticación de formularios y llamar a este método en el método Load

private bool IsValidSession() 
    { 
     bool isValidSession = true; 
     if (Context.Session != null) 
     { 
      if (Session.IsNewSession) 
      { 
       string cookieHeader = Request.Headers["Cookie"]; 
       if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        isValidSession = false; 
        if (User.Identity.IsAuthenticated) 
         FormsAuthentication.SignOut(); 
        FormsAuthentication.RedirectToLoginPage(); 
       } 
      } 
     } 
     return isValidSession; 
    } 
0

¿Está buscando redireccionar en la próxima solicitud, o redirigir de inmediato, sin la intervención del usuario? Si está buscando redirigir sin la intervención del usuario, puede usar ClientScript.RegisterStartupScript en su página maestra para inyectar un poco de javascript que redirigirá a sus clientes cuando caduque su sesión.

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    String timeoutPage = "SessionExpired.aspx"; // your page here 
    int timeoutPeriod = Session.Timeout * 60 * 1000; 

    sb.AppendFormat("setTimeout(\"location.href = {0};\",{1});", timeoutPage, timeoutPeriod); 
    Page.ClientScript.RegisterStartupScript(this.GetType(), "timeourRedirect", sb.ToString(), true); 
0

Code from here

namespace PAB.WebControls 

{ using System; usando System.ComponentModel; usando System.Web; usando System.Web.Security; usando System.Web.UI;

[DefaultProperty("Text"), 

    ToolboxData("<{0}:SessionTimeoutControl runat=server></{0}:SessionTimeoutControl>")] 

public class SessionTimeoutControl : Control 
{ 
    private string _redirectUrl; 

    [Bindable(true), 
     Category("Appearance"), 
     DefaultValue("")] 
    public string RedirectUrl 
    { 
     get { return _redirectUrl; } 

     set { _redirectUrl = value; } 
    } 

    public override bool Visible 
    { 
     get { return false; } 

    } 

    public override bool EnableViewState 
    { 
     get { return false; } 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     if (HttpContext.Current == null) 

      writer.Write("[ *** SessionTimeout: " + this.ID + " *** ]"); 

     base.Render(writer); 
    } 


    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 

     if (this._redirectUrl == null) 

      throw new InvalidOperationException("RedirectUrl Property Not Set."); 

     if (Context.Session != null) 
     { 
      if (Context.Session.IsNewSession) 
      { 
       string sCookieHeader = Page.Request.Headers["Cookie"]; 

       if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        if (Page.Request.IsAuthenticated) 
        { 
         FormsAuthentication.SignOut(); 
        } 

        Page.Response.Redirect(this._redirectUrl); 
       } 
      } 
     } 
    } 
} 

}

Cuestiones relacionadas