如何在asp.net mvc中完成会话状态超时时重定向到登录页面

时间:2012-12-14 05:49:48

标签: asp.net asp.net-mvc asp.net-mvc-4

我有一个ASP.NET MVC4应用程序,我正在实现sessionTimeout,如:

<configuration>
  <system.web>
    <sessionState timeout="2"></sessionState>
  </system.web>
</configuration>

在身份验证中:

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="1" />
    </authentication>
  </system.web>
</configuration>

会话到期后(2分钟),我需要重定向到登录页面,但不会发生重定向。

如何更改代码以便重定向?

3 个答案:

答案 0 :(得分:28)

一种方式是 如果会话过期,则必须在每个操作中检查其会话以及是否为空,然后重定向到“登录”页面。

但这是非常忙碌的方法 要完成此操作,您需要创建自己的ActionFilterAttribute来执行此操作,您只需在每个操作方法中添加此属性。

这是覆盖ActionFilterAttribute的类。

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

            // check if session is supported
            CurrentCustomer objCurrentCustomer = new CurrentCustomer();
            objCurrentCustomer = ((CurrentCustomer)SessionStore.GetSessionValue(SessionStore.Customer));
            if (objCurrentCustomer == null)
            {
                // check if a new session id was generated
                filterContext.Result = new RedirectResult("~/Users/Login");
                return;
            }

            base.OnActionExecuting(filterContext);
        }
    }

然后在操作中添加此属性,如下所示:

[SessionExpire]
public ActionResult Index()
{
     return Index();
}

这将使你工作。

答案 1 :(得分:23)

我发现在MVC中会话结束时重定向登录页面的非常简单的方法。我已经测试了它,这没有问题。

简而言之,我在1分钟之前的_Layout中捕获会话结束并进行重定向。

我试着一步一步地解释一切。

如果我们想在30分钟后结束会话并重定向到loginPage,请参阅以下步骤:

  1. 像这样更改网络配置(设置31分钟):

     <system.web>
        <sessionState timeout="31"></sessionState>
     </system.web>
    
  2. _Layout中添加此JavaScript(当此代码重定向前1分钟会话结束时,它会在用户上次操作后计算时间,而不是首次访问网站)

    <script>
        //session end 
        var sessionTimeoutWarning = @Session.Timeout- 1;
    
        var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000;
        setTimeout('SessionEnd()', sTimeout);
    
        function SessionEnd() {
            window.location = "/Account/LogOff";
        }
    </script>
    
  3. 这是我的LogOff Action,它只生成LogOff并重定向LoginIn Page

    public ActionResult LogOff()
    {
        Session["User"] = null; //it's my session variable
        Session.Clear();
        Session.Abandon();
        FormsAuthentication.SignOut(); //you write this when you use FormsAuthentication
        return RedirectToAction("Login", "Account");
    } 
    
  4. 我希望这对你来说是一个非常有用的代码。

答案 2 :(得分:5)

有一个通用解决方案:

假设您有一个名为Admin的控制器,您可以为授权用户放置内容。

然后,您可以覆盖管理员的 InitializeOnAuthorization方法,并在会话超时时将重定向写入登录页面逻辑,如下所述:

protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
    {
        //lets say you set session value to a positive integer
        AdminLoginType = Convert.ToInt32(filterContext.HttpContext.Session["AdminLoginType"]);
        if (AdminLoginType == 0)
        {
            filterContext.HttpContext.Response.Redirect("~/login");
        }

        base.OnAuthorization(filterContext);
    }