23 votos

Redirección de empuje de ASP.NET en tiempo de espera de sesión

Estoy en busca de una entrada de blog tutorial o ayuda en la técnica de sitios web que automáticamente los usuarios de push (es decir sin una devolución de datos) cuando expire el período de sesiones. Cualquier ayuda es apreciada

27voto

TJB Puntos 7536

Generalmente, se establece el tiempo de espera de sesión, y además se puede agregar un encabezado de página para redirigir automáticamente la página actual a una página donde usted borrar la sesión justo antes de que el tiempo de espera de sesión.

De http://aspalliance.com/1621_Implementing_a_Session_Timeout_Page_in_ASPNET.2

namespace SessionExpirePage
{
    public partial class Secure : System.Web.UI.MasterPage
    {
        public int SessionLengthMinutes
        {
            get { return Session.Timeout; }
        }
        public string SessionExpireDestinationUrl
        {
            get { return "/SessionExpired.aspx"; }
        }
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            this.PageHead.Controls.Add(new LiteralControl(
                String.Format("<meta http-equiv='refresh' content='{0};url={1}'>", 
                SessionLengthMinutes*60, SessionExpireDestinationUrl)));
        }
    }
}

El SessionExpireDestinationUrl debe enlace a una página donde usted borrar la sesión y cualquier otros datos de usuario.

Cuando la actualización de encabezado caduca, se redirigirá automáticamente a la página.

10voto

Beska Puntos 6717

Realmente no se puede "empujar" a un cliente de su sitio web. Su sitio responderá a las peticiones desde el cliente, pero que realmente es.

Lo que esto significa es que usted necesita para escribir algo del lado del cliente (Javascript) que va a determinar cuando el usuario se ha agotado el tiempo, probablemente por comparar el momento actual con la hora más reciente que tienen en un sitio cookie (que se puede actualizar con la hora actual, cada vez que el usuario visita una página en su sitio), y, a continuación, redirigir si la diferencia es mayor que cierta cantidad.

(Tomo nota de que algunas personas defienden la creación de un script que se adelante el usuario después de una cierta cantidad de tiempo en una página. Esto funcionará en el caso simple, pero si el usuario tiene dos ventanas abiertas en el sitio, y es utilizando una ventana mucho, y la otra ventana no-tan-mucho, el no-tan-mucho uno de repente redirigir al usuario a la página reenvío, aunque el usuario ha estado en el sitio constantemente. Además, no está realmente en sintonía con alguna sesión de mantenimiento que estás haciendo en el lado del servidor. Por otro lado, es ciertamente más fácil de código, y si es lo suficientemente bueno, entonces genial!)

6voto

devio Puntos 22981

En la sección < HEAD >, utilice una etiqueta META de actualización como esta:

<meta http-equiv="refresh" content="0000; URL=target_page.html">

donde 0000 es el timeout de sesión en segundos y target_page.html la dirección de la página para ser redirigido a.

2voto

ersegun Puntos 46

Solo copia y pega este fragmento de código en el archivo Web.Config:

<authentication mode="Forms">
  <forms loginUrl="~/Login.aspx" slidingExpiration="true" timeout="29" />
</authentication>

<sessionState timeout="30" mode="InProc" cookieless="false" />

Puede poner esta línea en el Site.Master:

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

2voto

Rasha Puntos 41

Estoy usando MVC3 ASp.net como principiante, he intentado muchas solución para resolver mi problema en las sesiones ( ya que estoy usando la variable de Sesión en mi código, y después de tiempo de espera no tenía valores de sesión, mientras yo voy a seguir utilizando Y acabo de descubrir que mi problema estaba en el archivo de configuración. el tiempo de espera entre la Autenticación y sessionState debe estar tan cerca. por lo Mataron (vacío) al mismo tiempo // añadir tiempo de espera de 1 y 2 para la prueba.. es debe ser de al menos 29 y 30 de

He utilizado otros de manera que se trabaje demasiado :

A partir de :

    protected void Session_Start(object src, EventArgs e)
    {
        if (Context.Session != null)
        {
            if (Context.Session.IsNewSession)//|| Context.Session.Count==0)
            {
                string sCookieHeader = Request.Headers["Cookie"];
                if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    //if (Request.IsAuthenticated)
                     FormsAuthentication.SignOut();
                     Response.Redirect("/Account/LogOn");
                }
            }
        }

    }

    protected void Session_End(object sender, EventArgs e)
    {
     //Code that runs when a session ends. 
     //Note: The Session_End event is raised only when the sessionstate mode 
     //is set to InProc in the Web.config file. If session mode is set to StateServer
      //or SQLServer, the event is not raised. 
        Session.Clear();          
    }

Y :

public class SessionExpireFilterAttribute : ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext ctx = HttpContext.Current;

        // check if session is supported
        if (ctx.Session != null)
        {

            // check if a new session id was generated
            if (ctx.Session.IsNewSession)
            {
                // If it says it is a new session, but an existing cookie exists, then it must
                // have timed out
                string sessionCookie = ctx.Request.Headers["Cookie"];
                if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    ctx.Response.Redirect("~/Home/LogOn");
                }
            }
        }

        base.OnActionExecuting(filterContext);
    }
}

E incluso trabajó con Ajax para resolver sesión issuse:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Session.Count == 0 || Session["CouncilID"] == null)
            Response.Redirect("/Account/LogOn");

        if (Request.IsAjaxRequest() && (!Request.IsAuthenticated || User == null))
        {
            filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
        }
        else
        {
            base.OnActionExecuting(filterContext);
        }
    }

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class AuthorizeUserAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (!httpContext.Request.IsAjaxRequest())
            {//validate http request.
                if (!httpContext.Request.IsAuthenticated
                    || httpContext.Session["User"] == null)
                {
                    FormsAuthentication.SignOut();
                    httpContext.Response.Redirect("~/?returnurl=" + httpContext.Request.Url.ToString());
                    return false;
                }
            }
            return true;
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new JsonResult
                {
                    Data = new
                    {
                        // put whatever data you want which will be sent
                        // to the client
                        message = "sorry, but you were logged out"
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }

    }

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: