Мне пришлось это сделать, но ни одно из решений, которые я нашел, не удовлетворило моими крайними требованиями JavaScript-анализа ошибок, которые я должен был избежать, чтобы перенаправить клиента на страницу входа.
Что я сделал должен был отправить простой ответ «NOAUTH» из моего пользовательского атрибута авторизации, затем перехватить ответ Ajax до того, как будут обработаны все обработчики событий, и перенаправить пользователя, установив window.location.
Серверная сторона:
protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
if (context.RequestContext.HttpContext.Request.IsAjaxRequest())
{
var result = new ContentResult {Content = "NOAUTH"};
context.Result = result;
return;
}
}
Тогда на стороне клиента:
$.ajaxSetup({
dataFilter: function (data, type) {
if (data !== "" && data === "NOAUTH") {
window.location = '/';
}
return data;
}
});
Я бы не рекомендовал этот подход. Если вам нужно это сделать, я бы, по крайней мере, предложил вместо этого добавить значение «NOAUTH» в заголовок ответа HTTP, а затем прочитать значение в глобальном обработчике JQuery.
Серверная сторона:
HttpContext.Current.Response.AddHeader("NOAUTH", "1");
Клиентская сторона:
$.ajaxSetup({
complete: function (jqXHR, textStatus) {
if (jqXHR.getResponseHeader("NOAUTH") === '1')
window.location = '/';
}
});
Обратите внимание, что использование dataFilter - единственный способ перехватить запросы ajax до того, как будут удалены любые другие обработчики событий.