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