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


  • 我有一个MVC 4 Web应用程序。
    • 部署到我的 iis7 环境。
    • 它使用窗口身份验证和模拟。
    • 根据公司策略,它设置为在 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);
                        }

如果有人遇到类似的问题,我最终通过使用 philpalmieri 的 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: ''
        });
});

如果有人有更好的解决方案,我很想听听...

最新更新