Question

Je travaille sur une page de connexion personnalisée dans mvc.net. Je vérifie les connexions comme ceci:

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;
  }

i puis décorer un contrôleur qui a besoin d'un accès administrateur avec un attribut de filtre:

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);
}

Je vois que, après me connecter, j'ai deux témoins:

  1. ASPXAUTH (avec date d'expiration ensemble à « À la fin de la session » (lorsque persiste est faux) OR (30 min à partir de maintenant (quand persiste est définie sur true)
  2. et qui ASP.NET_SessionId le temps d'expiration est toujours « À la fin de session »

Question: Le problème est que même si je TRUE à option « persiste » (qui fixera ASPXAUTH délai d'expiration 30 minutes à partir de maintenant est bonne -qui) ma session [ « adminid »] est toujours nul après i fermer et réouvrir le navigateur. Comment puis-je faire que mes sessions (Session [ « adminid »] et session [ « NomD'utilisateurAdmin »]) sont tirés à partir du cookie quand je ne mets d'abord « persiste » à true et à proximité puis ré-ouvrir la fenêtre browswer. merci

Était-ce utile?

La solution 2

J'ai trouvé ici ma solution: Est il est possible d'utiliser .ASPXAUTH pour mon propre système d'enregistrement?

et c'est ce que je l'ai fait:

    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);
    }
}

Autres conseils

Un cookie avec un temps d'expiration sont écrites sur le disque. L'utilisateur sera donc connecté encore à la prochaine fois qu'ils ouvrent un navigateur, à condition que le cookie n'a pas expiré.

Un cookie de session est stocké uniquement en mémoire et est perdue dès que le navigateur est fermé.

Un cookie de session est un cookie sans date d'expiration.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top