В моем проекте я использую WIF (но это не очень важно для контекста этого вопроса. Вы можете использовать альтернативную структуру, которая обрабатывает вашу аутентификацию. Вопрос в том, чтобы справляться с ошибками аутентификации при выполнении запросов ajax). Тем не менее, в моем случае я написал пользовательскую логику сервера, которая наследует от ClaimsAuthenticationManager
и обрабатывает аутентификацию:
public override IClaimsPrincipal Authenticate(string resourceName, IClaimsPrincipal incomingPrincipal)
{
if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated)
{
// add some custom claims
}
return incomingPrincipal;
}
Теперь, после того как я удалю все Cookies сеанса, закончите, затем снова введите любую страницу, я перенаправлен на страницу входа в систему, обслуживаемую WIF, и мне будет предложено снова зарегистрироваться. Все работает так, как ожидалось.
Но если я сделаю запрос ajax, у меня есть ошибка, которая перехвачена этим:
$(document).ready(function () {
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
// do something
}
});
});
К сожалению, объект XMLHttpRequest
не возвращает никакого значимого сообщения, на основе которого я мог бы обрабатывать такую ошибку любым другим способом, как другие. В этом конкретном случае я просто хочу, чтобы приложение перенаправлялось на страницу входа - как это делает обычный запрос.
Пока выполняется вызов ajax, вызывается метод Authenticate
from ClaimsAuthenticationManager
. Identity.IsAuthenticated
возвращает false, конец метода и все делается. Даже метод OnAuthorization
из BaseController
не вызывается, поэтому я не могу передать какой-либо статус объекту результата ajax.
protected override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest() && !User.Identity.IsAuthenticated)
{
//do something, for example pass custom result to filterContext
}
base.OnAuthorization(filterContext);
}
Как решить головоломку?