【问题标题】:How do I prevent a redirect loop when using SessionExpireFilterAttribute to catch session timeouts?使用 SessionExpireFilterAttribute 捕获会话超时时如何防止重定向循环?
【发布时间】:2015-03-16 15:29:39
【问题描述】:

再说一次,我是 MVC 新手,所以请放轻松。会话到期时,我需要将用户重定向到登录页面。我通过重载 SessionExpireFilterAttribute 类找到了一种方法,但我的网站陷入了重定向循环。我对 MVC 知之甚少,无法弄清楚发生了什么。有人可以解释如何防止重定向循环吗?

我用作模板的主页是http://www.codeblockdrive.com/2012/12/mvc-custom-filters-session-timeout.html,但我也搜索了stackoverflow并查看了几个页面,包括 MVC Session timeout issue, ASP.NET MVC Session.IsNewSession issue with Google Chrome, Redirecting to specified controller and action in asp.net mvc action filter.

这个页面Error: "This webpage has a redirect loop" in asp.net mvc 似乎最接近我的问题,但我尝试了那里提到的解决方案(将 SessionExpireFilter 移动到单独的控制器),但它没有帮助我。

这里是捕获会话超时的代码。它位于 App_Start 文件夹中名为 FilterConfig.cs 的文件中:

 public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new SessionExpireFilterAttribute());
    }
}

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

        // check if session is supported
        if (ctx.Session != null)
        {
            // check if a new session id was generated
            if (ctx.Session.IsNewSession)
            {
                // If it says it is a new session, but an existing cookie exists, then it must
                // have timed out
                string sessionCookie = ctx.Request.Headers["Cookie"];
                if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0 && sessionCookie != "reset"))
                {
                    ctx.Response.Redirect("~/Admin/Login");
                }
            }
            base.OnActionExecuting(filterContext);
        }
    }
}

然后我将这段代码放在一个名为 ErrorController.cs 的控制器中。我也在 AdminController.cs 中尝试过这个,但我将它移到了一个单独的控制器而不是 Login 方法。

public class ErrorController : Controller
{
    [SessionExpireFilter]
    public ActionResult Index2()
    {
        // This method will not execute if our session has expired

        // render Home Page
        return View();
    }
}

然后这里是登录方法。它在 AdminController.cs 中。当它到达“返回视图”部分时,它会转到 SessionExpireFilterAttribute。

public ActionResult Login()
    {
        if (Session["AdminUserName"] != null)
        {
            return RedirectToAction("Index");
        }

        ModelAdminLogin obj_MAL = new ModelAdminLogin();

        Session["Captcha"] = ClientUtility.GenerateRandomCode();

        Session["ErrMsg"] = null;

        if ((Request.Cookies["ADMINUSERNAME"] != null) && (Request.Cookies["ADMINPASSWORD"] != null))
        {
            obj_MAL.UserName = ClientUtility.DecryptString(Request.Cookies["ADMINUSERNAME"].Value);
            obj_MAL.Password = ClientUtility.DecryptString(Request.Cookies["ADMINPASSWORD"].Value);
            obj_MAL.RememberMe = true;

            return View(obj_MAL);
        }
        else
        {
            return View(obj_MAL);
        }
    }

总而言之,当会话超时时,站点调用 SessionExpireFilterAttribute.OnActionExecuting(根据需要)重定向到视图 Admin/Login(根据需要),但在页面显示给用户之前,它调用 SessionExpireFilterAttribute.OnActionExecuting这再次开始循环。最终,我收到错误消息“此网页有重定向循环”。我需要一种在会话结束时重定向到登录页面的方法,并且在它到达登录页面后不让它返回到 SessionExpireFilterAttribute 类。

如果有任何帮助,我将不胜感激。谢谢。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 session-timeout


    【解决方案1】:

    我怀疑您也将属性放在登录操作上,这会导致循环。在登录操作中使用AllowAnonymous 属性:

     [AllowAnonymous]
     public ActionResult Login()
    {
    
    }
    

    【讨论】:

    • 那行不通。我在 Login 方法之前添加了 [AllowAnonymous],但它陷入了同一个重定向循环。以前没有该方法的属性。感谢您的建议;如果你还有什么我可以尝试的,请告诉我。
    • @boilers222 你能展示你的登录动作吗?如果显示完整的控制器会更好
    • 控制器的登录部分显示在我原来的问题中。这正是它在控制器中的外观(没有属性或过滤器)。
    • 然后你必须检查过滤器,如果请求来自登录操作呈现登录视图
    • 感谢 Ehsan。我该怎么做?同样,这是我在 MVC 中的第一个项目,我继承了一个部分完成的网站,所以我边走边学。
    猜你喜欢
    • 2012-01-03
    • 2010-11-23
    • 2017-04-08
    • 2013-07-23
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多