Я выполняю вызов 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 вернуть мою страницу входа в систему, что, очевидно, не работает.
Как мне заставить это работать ?