2011-01-13 2 views
1

Я работаю над пользовательской страницей входа в mvc.net. Я проверяю логины так:. Вопрос об аутентификации форм.

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

тогда я украсит любой контроллер, который должен доступ администратора с помощью атрибута фильтра:

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

я вижу, что после входа в меня два печенья:

  1. ASPXAUTH (с датой истечения срока действия - «В конце сеанса» (когда сохраняется недействительно) ИЛИ (30 мин. От сейчас (когда для persists установлено значение true)
  2. и ASP.NET_SessionId, которые время истечения срока действия всегда «В конце сессии»

Вопрос: Проблема заключается в том, что даже если я установить значение TRUE для «сохраняется» вариант (который устанавливает время истечения ASPXAUTH 30 мин., Что хорошо) моя сессия [«AdminId»] всегда имеет значение null после закрытия и повторного открытия браузера. Как я могу убедиться, что мои сеансы (Session ["AdminId"] и Session ["AdminUsername"]) вытащили из файла cookie, когда я изначально установил «persists» в true и close, а затем снова откроет окно browswer. thanks

+1

Упорное параметр работает, установив Истекает свойство куки, если установлено верно. То, что вы установили, истекает в вашем web.config. Вы пробовали проверять содержимое cookie с помощью т. Е. Скрипач, чтобы узнать, установлено ли истечение срока действия или нет? –

ответ

0

Я нашел решение здесь: Is it possible to use .ASPXAUTH for my own logging system?

и это то, что я сделал:

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

Печенье с истечением срока годности записывается на диск. Таким образом, пользователь будет по-прежнему регистрироваться в следующий раз, когда они откроют браузер, при условии, что cookie не истек.

Сессионный файл cookie хранится только в памяти и утерян, как только браузер закрыт.

Сессия cookie - это файл cookie без истечения срока годности.

+0

У моего ASP.NET_SessionId файла cookie нет даты истечения срока действия, даже если я установил для него значение true. ? – ShaneKm

+0

Если вы его не установили, по умолчанию 30 минут –

+0

да, это работает, но как я вытащил свой сеанс из файла cookie. см. отредактированный вопрос выше. благодаря – ShaneKm

Смежные вопросы