2015-11-11 136 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]注释配置您的控制器?