空闲超时后,MVC4应用程序中的会话超时处理程序中出现无限循环问题

时间:2013-09-05 16:53:55

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

  • 我有一个MVC 4网络应用程序
    • 部署到我的iis7环境。
    • 它使用Windows身份验证和模拟。
    • 根据公司政策,设置为15分钟后的会话超时。

这在asp.net应用程序中始终正常。但我现在有一个MVC4应用程序,所以不是使用global.asax和session_start来确定会话是否超时并重定向,我现在已经设置了一个会话过期动作过滤器。

所有工作都按预期工作,在会话超时时重新定向,直到用户离开应用程序空闲。应用程序池上的空闲超时为20分钟,我认为这是问题。

如果我的用户打开他的应用程序并前往他们经常进行的会议,并且达到空闲超时,当他们回来并尝试做某个时间并且应用程序尝试重新指导会话超时时,我可以在错误日志中看到它被困在循环中,永远不会重定向。

事后(即空闲超时)尝试重新指示是否为时已晚?以前在asp.net应用程序(非MVC)中,我曾经总是在global.asax的会话开始时执行此操作(即重定向会话超时)并且它起了作用。很明显,这个事件总是在应用程序空闲超时开始之前被击中。

任何帮助将不胜感激,这是我的会话处理程序的代码:

 public class SessionExpireAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// Called by the ASP.NET MVC framework after the action method executes.
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
        }

         ///<summary>
         ///Called by the ASP.NET MVC framework before the action method executes.
         ///</summary>
         ///<param name="filterContext">The filter context.</param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Session != null)
            {
                if (filterContext.HttpContext.Session.IsNewSession)
                {
                    var sessionStateDetails =(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
                    var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];
                    if ((sessionCookie != null) && (sessionCookie.IndexOf(sessionStateDetails.CookieName) >= 0))
                    {
                        if (filterContext.HttpContext.Request.IsAjaxRequest())
                        {
                            filterContext.HttpContext.Response.Clear();
                            filterContext.HttpContext.Response.StatusCode = 403;

                        }
                        else
                        {

                            RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
                            redirectTargetDictionary.Add("action", "SessionTimeout");
                            redirectTargetDictionary.Add("controller", "Home");

                            filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);

                        }

1 个答案:

答案 0 :(得分:0)

如果有人遇到类似问题,我最后使用philpalmieri's jquery插件解决了这个问题,该插件可以在Github找到。

通过将其设置为20分钟的空闲超时,并以这种方式调用它,它总是在应用程序进入空闲状态之前重定向到会话超时,因此我的inifinte循环永远不会发生:

function logout() {
    ////session redirect goes here 
    var pathArray = window.location.pathname.split('/');
    var segment_1 = pathArray[1];
    window.location =  window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout";
}

$(document).ready(function () {
    var SEC = 1000;
    var MIN = 60 * SEC;
        $(document).idleTimeout({
            inactivity: 20 * MIN,
            noconfirm: 2 * SEC,
            redirect_url: 'javascript:logout()',
            click_reset: true,
            alive_url: '',
            logout_url: ''
        });
});

如果有人有更好的解决方案,我很乐意听到它......