2011-10-21 66 views
1

我在每個操作上使用SessionExpireFilter來檢查會話是否已過期。如果會話已過期則用戶sessionTimeoutPage即重定向到membershipController和SessionTimeOut查看始終被重定向到SessionTimeOut頁面ASP.net MVC

過濾器看起來喜歡 -

public class SessionExpireFilterAttribute : ActionFilterAttribute 
{ 
    /// <summary> 
    /// Called when [action executing]. 
    /// </summary> 
    /// <param name="filterContext">The filter context.</param> 
    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)) 
       { 
        if (ctx.Request.IsAuthenticated) 
        { 
         FormsAuthentication.SignOut(); 
        } 

        //HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId"); 
        //mycookie.Expires = DateTime.MinValue; 
        //ctx.Response.Cookies.Add(mycookie); 
        //ctx.Session.Clear(); 

        RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
        redirectTargetDictionary.Add("action", "SessionTimeOut"); 
        redirectTargetDictionary.Add("controller", "Membership"); 
        filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); 

       } 
      } 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

的問題是我有一個會員控制器登錄操作方法也有過濾器。它會檢查會話是否過期,並始終找到ASP.NET_SessionId cookie並一次又一次重定向到sessionTimeout頁面(其中有一個鏈接登錄頁面)

這對有人能幫助很大。

回答

0

要使此解決方案正常工作,您需要在Global.asax中連接Session_Start事件。如果你不這樣做,Session.IsNewSession將始終爲真(這是ASP.NET運行時的工作方式)。有時候還需要在Session中存儲一些東西(任何東西)。

+0

我認爲它很好,因爲我正在做登錄和它的全新會話。我遇到的問題是使用ASP.Net_session即使在新的會話中,cookie也總是存在 – Amit

+0

而且,相信我是運行時的工作方式(並且執行登錄與Session無關),只需將事件連接起來即可檢查。 – tpeczek

+0

對不起,但它並沒有通過接線事件 – Amit