ха-ха ...

аю ajax-вызов, используя jquery для действия контроллера mpc asp.net:

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

По истечении времени сеанса этот вызов не будет выполнен, поскольку объект User сохраняется в сеансе. Я создал собственный атрибут авторизации, чтобы проверить, был ли сеанс потерян, и перенаправить на страницу входа. Это отлично работает для запросов страниц, однако не работает для запросов 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, но затем продолжит действие контроллера и выдаст объект ref, не установленный в качестве экземпляра ошибки объекта, который затем вернет ошибку 500 обратно в js на стороне клиента. Если я изменю свой собственный атрибут Authorize, чтобы также проверять запросы ajax и возвращал false для тех, кто не прошел проверку подлинности, то запрос ajax возвращает мою страницу входа, что, очевидно, не работает.

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

Ответы на вопрос(8)

Ваш ответ на вопрос