27

我有一个 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 分钟)后,我需要重定向到登录页面,但不会发生重定向。

如何更改代码以使其重定向?

4

3 回答 3

33

一种方法是在会话过期的情况下,在每个操作中您都必须检查其会话,如果它为空,则重定向到登录页面。

但这是非常忙碌的方法 要克服这个问题,您需要创建自己的方法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();
}

这会让你工作。

于 2012-12-14T07:03:34.040 回答
31

我发现在 MVC 中会话结束时重定向登录页面的非常简单的方法。我已经对其进行了测试,并且可以正常工作。

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

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

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

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

     <system.web>
        <sessionState timeout="31"></sessionState>
     </system.web>
    
  2. 添加此 JavaScript _Layout(当会话在此代码重定向前 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 页面

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

我希望这对您来说是一个非常有用的代码。

于 2015-09-16T12:30:30.303 回答
6

有一个通用的解决方案:

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

然后,您可以覆盖Admin 控制器的InitializeorOnAuthorization方法,并在这些方法中在会话超时时将重定向写入登录页面逻辑,如下所述:

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);
    }
于 2013-09-27T10:54:33.113 回答