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