vida variable validar usuario una tiempo sesión sesion redireccionar página pudo por net mantener inactividad expirado expira encontrar cuando cerrar asp activa c# asp.net

c# - variable - ¿Cómo puedo redireccionar a una página cuando caduca la sesión del usuario?



validar sesion activa c# (10)

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.

¡Gracias!


¿Está buscando redirigir 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);


¿Estás poniendo algo en el objeto Session que siempre debería estar ahí? En otras palabras, si inician sesión, puede que esté colocando algo como ID de usuario en la sesión

Session("UserID") = 1234

Entonces, si ese es el caso, entonces podría agregar algo a su código detrás de la página maestra que verifica ese valor. Algo como esto:

Dim UserID As Integer = 0 Integer.TryParse(Session("UserID"), UserID) If UserID = 0 Then Response.Redirect("/sessionExpired.aspx") End If


No puede redirigir al usuario cuando la sesión expira porque no hay una solicitud 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 necesita redirigirlos.
  • 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 una característica del lado del cliente (por ejemplo, el temporizador de JavaScript, etc.), por lo tanto, necesita manejar el redireccionamiento en una Session_OnStart en su lugar, pero obviamente necesita distinguir esto de alguien que vuelve al sitio. 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 ordenar en el lado del servidor; es solo la interacción del cliente que no está disponible para usted.


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.


Codigo de aqui

namespace PAB.WebControls

{using System; utilizando System.ComponentModel; usando System.Web; utilizando 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); } } } } }

}


Agregue o actualice su archivo Web.Config para incluir esto o algo similar:

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


La otra forma es decirle al navegador que se redirija a sí mismo (a través de javascript) después de una cierta cantidad de tiempo ... pero eso siempre puede ser desactivado por el usuario.


Puede manejar esto en global.asax en el evento Session_Start. Puede verificar una cookie de sesión en la solicitud allí. Si la cookie de sesión existe, 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") } }

Lamentablemente, no he encontrado ninguna forma elegante de averiguar el nombre de la cookie de sesión.


Si entiendo correctamente, "Session_End" se dispara internamente y no tiene un contexto HTTP asociado a él:

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

Por lo tanto, no creo que puedas usarlo para redirigir al usuario. He visto a otros sugerir usar el evento "Session_OnStart ()" en el archivo global.ascx:

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

No lo he intentado, pero poner el siguiente código en "global.ascx" podría funcionar para usted:

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


Usamos la Autenticación de formularios y llamamos a este método en el método Page_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; }