Pregunta

Estoy trabajando en una página de inicio de sesión personalizado en mvc.net. Reviso los inicios de sesión de este modo:

public bool Login(string login, string password, bool persistent)
{
  var loginEntity = this.AdminRepository.GetLogin(login, password);
  if (loginEntity != null)
  {
    FormsAuthentication.SetAuthCookie(login, persistent);

    HttpContext.Current.Session["AdminId"] = loginEntity.AdminId;
    HttpContext.Current.Session["AdminUsername"] = loginEntity.Username;

  return true;
  }

entonces i decorar cualquier controlador que necesita acceso de administrador con un atributo de filtro:

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

  // check if session is supported
  if (ctx.Session != null)
  {
    var redirectTargetDictionary = new RouteValueDictionary();

    // 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)) || null == sessionCookie)
        {
          redirectTargetDictionary = new RouteValueDictionary();
          redirectTargetDictionary.Add("area", "Admin");
          redirectTargetDictionary.Add("action", "LogOn");
          redirectTargetDictionary.Add("controller", "Home");

          filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
        }
      } else if (SessionContext.AdminId == null) {
        redirectTargetDictionary = new RouteValueDictionary();
        redirectTargetDictionary.Add("area", "Admin");
        redirectTargetDictionary.Add("action", "LogOn");
        redirectTargetDictionary.Add("controller", "Home");

        filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
      }
    }
    base.OnActionExecuting(filterContext);
}

Me ver que después del registro en el que tengo dos galletas:

  1. ASPXAUTH (con juego fecha de caducidad a "fin de la sesión A" (cuando persiste es falso) OR (30 min desde ahora (cuando persiste se establece en true)
  2. y ASP.NET_SessionId que tiempo de expiración es siempre "al final de sesión "

Pregunta: El problema es que a pesar de que me puse a TRUE opción "persiste" (que establecerá ASPXAUTH tiempo de caducidad de 30 minutos a partir de ahora -que es bueno) mi sesión [ "adminid"] es siempre nula después de cerrar y volver a abrir el navegador. ¿Cómo me aseguro de que mi Sesiones (Session [ "adminid"] y la Sesión [ "AdminUsername"]) se tira desde la cookie cuando inicialmente no ajuste "persiste" true y cierre a continuación, volver a abrir la ventana browswer. gracias

¿Fue útil?

Solución 2

He encontrado mi solución aquí: Es posible el uso de .ASPXAUTH para mi propio sistema de registro?

y esto es lo que hice:

    public class SessionExpireFilterAttribute : ActionFilterAttribute
{
    /// <summary>
    /// Controller action filter is used to check whether the session is still active. If the session has expired filter redirects to the login screen.
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var ctx = HttpContext.Current;

        // check if session is supported
        if (ctx.Session != null)
        {
            // check if a new session id was generated
            if (ctx.Session.IsNewSession)
            {
                var identity = ctx.User.Identity;

                // 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)) || null == sessionCookie)
                {
                    var redirectTargetDictionary = new RouteValueDictionary();
                    redirectTargetDictionary.Add("area", string.Empty);
                    redirectTargetDictionary.Add("action", "LogOn");
                    redirectTargetDictionary.Add("controller", "User");

                    filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
                }

                // Authenticated user, load session info
                else if (identity.IsAuthenticated)
                {
                    var loginRepository = new LoginRepository(InversionOfControl.Container.Resolve<IDbContext>());
                    IAuthenticationService authenticationService = new AuthenticationService(loginRepository);
                    authenticationService.SetLoginSession(identity.Name);
                }
            }
            else if (SessionContext.LoginId == null)
            {
                var redirectTargetDictionary = new RouteValueDictionary();
                redirectTargetDictionary.Add("area", string.Empty);
                redirectTargetDictionary.Add("action", "LogOn");
                redirectTargetDictionary.Add("controller", "User");

                filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
            }
        }
        base.OnActionExecuting(filterContext);
    }
}

Otros consejos

Una cookie con un tiempo de expiración se escribe en el disco. El usuario será por lo tanto todavía puede registrar en la próxima vez que abren un navegador, a condición de que la cookie no ha caducado.

Una cookie de sesión sólo se almacena en la memoria y se pierde en cuanto se cierra el navegador.

Una cookie de sesión es una galleta que no tienen fecha de caducidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top