Manejo del tiempo de espera de la sesión en llamadas ajax

Estoy haciendo una llamada ajax usando jquery a una acción del controlador asp.net mvc:

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult GetWeek(string startDay)
        {
            var daysOfWeek = CompanyUtility.GetWeek(User.Company.Id, startDay);
            return Json(daysOfWeek);
        }

Cuando se agota el tiempo de espera de la sesión, esta llamada fallará, ya que el objeto Usuario se almacena en la sesión. Creé un atributo de autorización personalizado para verificar si la sesión se perdió y redirigir a la página de inicio de sesión. Esto funciona bien para solicitudes de página, sin embargo, no funciona para solicitudes ajax, ya que no puede redirigir desde una solicitud ajax:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class AuthorizeUserAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (!httpContext.Request.IsAjaxRequest())
            {//validate http request.
                if (!httpContext.Request.IsAuthenticated
                    || httpContext.Session["User"] == null)
                {
                    FormsAuthentication.SignOut();
                    httpContext.Response.Redirect("~/?returnurl=" + httpContext.Request.Url.ToString());
                    return false;
                }
            }
            return true;
        }
    }

Leí en otro hilo que cuando el usuario no está autenticado y usted realiza una solicitud ajax, debe establecer el código de estado en 401 (no autorizado) y luego verificarlo en js y redirigirlo a la página de inicio de sesión. Sin embargo, no puedo hacer que esto funcione:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (Request.IsAjaxRequest() && (!Request.IsAuthenticated || User == null))
            {
                filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
            }
            else
            {
                base.OnActionExecuting(filterContext);
            }
        }

Básicamente, lo establecerá en 401, pero luego continuará en la acción del controlador y arrojará una referencia de objeto no establecida a una instancia de un error de objeto, que luego devuelve el error 500 al js del lado del cliente. Si cambio mi atributo Autorizar personalizado para validar también las solicitudes de ajax y devuelve falso para aquellos que no están autenticados, eso hace que la solicitud de ajax devuelva mi página de inicio de sesión, que obviamente no funciona.

¿Cómo hago que esto funcione?

Respuestas a la pregunta(8)

Su respuesta a la pregunta