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

Jon*_*han 24 asp.net asp.net-mvc asp.net-mvc-4

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

<configuration>
  <system.web>
    <sessionState timeout="2"></sessionState>
  </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

在身份验证中:

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="1" />
    </authentication>
  </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*544 29

一种方法是,在Session Expire的情况下,在每个操作中,您必须检查其会话,如果它是null,则重定向到Login页面.

但这是一个非常忙碌的方法 为了解决这个问题,你需要创建自己的方法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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

[SessionExpire]
public ActionResult Index()
{
     return Index();
}
Run Code Online (Sandbox Code Playgroud)

这将是你的工作.


Avt*_*ili 23

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

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

我试着一步一步解释一切.

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

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

     <system.web>
        <sessionState timeout="31"></sessionState>
     </system.web>
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)
  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");
    } 
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 即使用户仍在工作,这也会重定向到登录 (3认同)

T G*_*pta 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);
    }
Run Code Online (Sandbox Code Playgroud)