none
¿Cómo cerrar sesión automáticamente después de culminado el tiempo de sesión y redireccionarlo al login? RRS feed

  • Pregunta

  •   Hola a todos, tengo una consulta y es la siguiente:

        Cómo puedo hacer para que después de haber culminado el tiempo de la sesión se cierre automaticamente y se  redireccione al login.

      Ya que el problema que he tenido es que una vez que pasa el tiempo de la sesión las variables que obtuve de la misma me generan error  ya que quedan nulos porque caduco la sesión.

    public ActionResult Login(string usuario, string contraseña)
            {
                if (!string.IsNullOrEmpty(usuario) && !string.IsNullOrEmpty(contraseña))
                {
                    var objUsuario = db.Database.SqlQuery<Usuario>("sp_login @param1, @param2",
                                                            new SqlParameter("@param1", usuario),
                                                            new SqlParameter("@param2", contraseña)).FirstOrDefault();
                    if (objUsuario != null)
                    {
                        if (objUsuario.Flag_Estado == false)
                        {
                            return RedirectToAction("Index", "Acceso", new { message = "Su cuenta ha sido dado de baja" });
    
                        }
                        else
                        {
                            if (objUsuario.CodPerfil.Trim() == "ASIGNADOR")
                            {
    
                                Session["objUsuario"] = objUsuario;
                                FormsAuthentication.SetAuthCookie(objUsuario.CodUsuario, true);
                                return RedirectToAction("AsignarTicket", "Ticket");
                            }
                            else if ((objUsuario.CodPerfil.Trim() == "DESARROLLADOR"))
                            {
                                Session["objUsuario"] = objUsuario;
                                FormsAuthentication.SetAuthCookie(objUsuario.CodUsuario, true);
                                return RedirectToAction("AtenderTicket", "Ticket");
                            }
                            else
                            {
                                Session["objUsuario"] = objUsuario;
                                FormsAuthentication.SetAuthCookie(objUsuario.CodUsuario, true);
                                return RedirectToAction("Index", "Ticket");
                            }
                        }
    
                    }
                    else
                    {
                        return RedirectToAction("Index", "Acceso", new { message = "Usuario y/o contraseña incorrecta" });
                    }
                }
                else
                {
                    return RedirectToAction("Index", "Acceso", new { message = "Usuario y/o contraseña incorrecto" });
                }
            }
    
            [Authorize]
            public ActionResult Logout()
            {
                FormsAuthentication.SignOut();
                return RedirectToAction("Index", "Acceso");
            }

    martes, 26 de enero de 2021 22:34

Respuestas

  • El Session timeout está en minutos en el web.config. 10 horas sería un 600 minutos. Pero no tienes por qué poner 10 horas, pon aquí el valor que consideres razonable para que tus usuarios nunca lleguen a alcanzar ese tiempo. Por ejemplo, si la máxima inactividad es de 2 horas a la hora de comer, podrías poner en el Session 150 minutos para dejar un margen.

    <system.web>
      <sessionState timeout="600">
    </sessionState>

    En cuanto al Timer, hay muchas formas de hacerlo. Solo tiene sentido si estás usando un valor pequeño en el web.config. Si pones un valor grande, no merece la pena molestarse en añadir el Timer.

    Una manera sencilla consiste en poner un UpdatePanel en la página, meter dentro un Timer de las extensiones Ajax, configurarlo para que se dispare cada cierto número de minutos (menor que los que tengas en el web config), y no hacer nada en el evento Tick; el mero hecho de que se dispare ya reinicia la sesión. Si necesitas hacerlo en muchas páginas, y las diferentes páginas "cuelgan" de una .master común, basta con que hagas esto en la master para que la sesión se mantenga viva en todas las páginas.

    En este artículo se presenta otra alternativa, usando un Iframe que carga una página con un "meta refresh". De esa manera no se necesita un Timer: http://www.primaryobjects.com/2008/01/29/preventing-session-timeouts-in-c-asp-net-web-applications/

    • Marcado como respuesta EricRRModerator viernes, 29 de enero de 2021 16:54
    miércoles, 27 de enero de 2021 17:30

Todas las respuestas

  •  Ya que el problema que he tenido es que una vez que pasa el tiempo de la sesión las variables que obtuve de la misma me generan error  ya que quedan nulos porque caduco la sesión.

    Hay un truco para que no caduque, que consiste en embeber un timer en la página y que dentro del código del timer se ejecute periódicamente una llamada al servidor. Esto puedes hacerlo por AJAX, o podrías usar un minúsculo IFRAME que dentro cargue una página con el timer que se refresque periódicamente. Si en el web.config tienes configurada la duración de la sesión a 20 minutos, puedes poner en el timer que se dispare a los 19 minutos, y así nunca caduca la sesión. Otra opción es cambiar la duración de la sesión en el web.config y ponerle que dure diez horas, por ejemplo.

    miércoles, 27 de enero de 2021 8:08
  • A cuanto equivale 10 horas en timeout del webconfig o si tuvieses un ejemplo de como poner un timer para que no caduque mis variables.
    miércoles, 27 de enero de 2021 13:45
  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    miércoles, 27 de enero de 2021 14:02
    Moderador
  • El Session timeout está en minutos en el web.config. 10 horas sería un 600 minutos. Pero no tienes por qué poner 10 horas, pon aquí el valor que consideres razonable para que tus usuarios nunca lleguen a alcanzar ese tiempo. Por ejemplo, si la máxima inactividad es de 2 horas a la hora de comer, podrías poner en el Session 150 minutos para dejar un margen.

    <system.web>
      <sessionState timeout="600">
    </sessionState>

    En cuanto al Timer, hay muchas formas de hacerlo. Solo tiene sentido si estás usando un valor pequeño en el web.config. Si pones un valor grande, no merece la pena molestarse en añadir el Timer.

    Una manera sencilla consiste en poner un UpdatePanel en la página, meter dentro un Timer de las extensiones Ajax, configurarlo para que se dispare cada cierto número de minutos (menor que los que tengas en el web config), y no hacer nada en el evento Tick; el mero hecho de que se dispare ya reinicia la sesión. Si necesitas hacerlo en muchas páginas, y las diferentes páginas "cuelgan" de una .master común, basta con que hagas esto en la master para que la sesión se mantenga viva en todas las páginas.

    En este artículo se presenta otra alternativa, usando un Iframe que carga una página con un "meta refresh". De esa manera no se necesita un Timer: http://www.primaryobjects.com/2008/01/29/preventing-session-timeouts-in-c-asp-net-web-applications/

    • Marcado como respuesta EricRRModerator viernes, 29 de enero de 2021 16:54
    miércoles, 27 de enero de 2021 17:30