Обработка тайм-аута сеанса в вызовах ajax

Я выполняю вызов ajax с помощью jquery для действия контроллера asp.net mvc:

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

Когда время сеанса истекает, этот вызов завершится ошибкой, поскольку пользователь объект хранится в сеансе. Я создал настраиваемый атрибут авторизации, чтобы проверить, не был ли потерян сеанс, и перенаправить на страницу входа. Это отлично работает для запросов страниц, однако не работает для запросов ajax, поскольку вы не можете перенаправить из запроса 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;
        }
    }

Я прочитал в другом потоке, что, когда пользователь не аутентифицирован, а вы делаете запрос ajax , вы должны установить код состояния на 401 (неавторизованный), а затем проверить это в js и перенаправить их на страницу входа. Однако я не могу заставить это работать:

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

Обычно он устанавливает значение 401, но затем он переходит к действию контроллера и генерирует ссылку на объект, не установленную для экземпляра ошибки объекта, которая затем возвращает ошибку 500 обратно клиентской стороне js. Если я изменю свой собственный атрибут Authorize для проверки запросов ajax и верну false для тех, которые не аутентифицированы, это заставит запрос ajax вернуть мою страницу входа в систему, что, очевидно, не работает.

Как мне заставить это работать ?

56
задан tereško 30 June 2012 в 00:16
поделиться