2015-11-11 132 views
0

概括地說,我想表明loginpage時如下圖所示,我已經修改了在web.config中的一些細節的會議expires.For這樣我就可以測試是否邏輯works.But可悲的是下面的邏輯在不觸發在asp.net mvc4中設置會話超時?

我的期望是當會話到期時在Account Controller中去Login Action

而且什麼在authentication sectionsession state部分超時之間的差異

<authentication mode="Forms">  
    <forms loginUrl="~/Account/Login" timeout="1" /> 
</authentication> 

<sessionState mode="InProc" timeout="1" customProvider="DefaultSessionProvider"> 
    <providers> 
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> 
    </providers> 
</sessionState> 
+0

[他們](https://msdn.microsoft.com/en-us/library/system.web.configuration.formsauthenticationconfiguration.timeout%28v=vs.110%29.aspx)[記錄](https: //msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.timeout%28v=vs.110%29.aspx) – stuartd

回答

1

您可以通過使用自定義屬性象下面這樣實現的:

public class SessionTimeOutAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      HttpContext context = HttpContext.Current; 

      // check if session supported 
      if (context.Session != null) { 
       if(context.Session["username"] == null) { 
        context.Response.Redirect ("~/Account/Login"); 
       } 
      } 
      base.OnActionExecuting(filterContext); 
     } 
    } 

然後,你可以將此屬性應用到您的控制器或者像這樣的特定動作:

或行動:

 [SessionTimeOut] 
     public ActionResult Index() 
     { 
     return Index(); 
     } 
+0

GlobalFilters.Filters.Add(new SessionExpireFilterAttribute())https ://stackoverflow.com/questions/25423464/redirect-to-specific-page-after-session-expires-mvc4 – forX

0

根據this答案,這些超時屬性的基本區別是:

<authentication mode="Forms">  
    <forms loginUrl="~/Account/Login" timeout="1" /> 
</authentication> 

「的形式驗證超時值設置在分鐘的時間量,所述認證cookie設置爲有效「

<sessionState mode="InProc" timeout="1" customProvider="DefaultSessionProvider"> 
    <providers> 
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> 
    </providers> 
</sessionState> 

」SessionState超時值設置會話狀態提供程序的時間量需要將數據保存在內存中(或者正在使用的任何後備存儲,SQL Server,OutOfProc等)。「

您是否在RegisterGlobalFilters中註冊了授權過濾器?

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new AuthorizeAttribute()); 
} 

並且還使用[Authorize]註釋配置您的控制器?