0

Я пытаюсь обрабатывать неудавшийся запрос ajax в аутентификации формы MVC. Я добавил следующий код в Global.asax.ajax mvc form authentication redirect issue

protected void Application_BeginRequest() 
    { 
     HttpRequestBase request = new HttpRequestWrapper(Context.Request); 
     if (request.IsAjaxRequest()) 
     { 
      Context.Response.SuppressFormsAuthenticationRedirect = true; 
     } 
    } 

и на основной раскладке, я добавил следующий код

$(document).ajaxError(function (event, request, settings) { 
      if (request.status == 401) { 
       window.location.href = '@Url.Action("Login", "Account")'; 
      } 
     }); 

Выпуск 1: На обычных вызовов форма autheication перенаправляет на страницу входа в систему вместе с возвратного URL, который будет помогите пользователю вернуться к той же странице, которую он последний раз посещал до истечения срока действия. http://localhost:53733/Account/Login?ReturnUrl=%2fUser%2fUserList

Где как во время ajax-вызова, так как я перенаправляю с помощью jQuery, это http://localhost:53733/Account/Login. Как можно сделать обеспечить даже в Ajax называют его перенаправляет на страницу входа в систему вместе с возвратным URL

Выпуск 2: Также местные пожары функция Аякса обработчика ошибок до глобального обработчика ошибок Ajax. Это приведет к отображению ошибки на странице перед переходом на страницу входа. Не знаете, как справиться с этим. Пожалуйста посоветуй.

ответ

0

Вы можете отправить текущий URL как ReturnUrl

var u = '@Url.Action("Login", "Account")?ReturnUrl='+window.location.href; 
window.location.href = u; 

Помните, что после успешного входа в систему, ваш Логин метод действия будет перенаправлять на значение ReturnUrl, который будет полностью новый запрос GET. Так пользователь увидит страницу, как при загрузке новой страницы (он потеряет какие-либо изменения, сделанные на странице перед тем, как перенаправлены)

Для второго вопроса, то в вашей локальной функции AJAX, не справиться, если request.status == 401

Что-то вроде

$.ajax({ 
    url: "someUrl", 
    type: "post" 
}).done(function(f) { 
    console.log('done'); 
}).fail(function(a, b, c) { 
    if (a.status !== 401) { 
     // Handle locally as needed. 
    } 
}); 
+0

Спасибо. У нас есть глобальное решение для второй проблемы. Существует много вызовов ajax, которые мне нужно изменить. –

+1

@TechJerk Я думаю, вам нужно это сделать. В противном случае оба будут выполнены (первый локальный, второй глобальный) – Shyju

+0

window.location.href получает полный URL http: // localhost: 53733 /? ReturnUrl = http: // localhost: 53733/User/UserList. Я ожидаю что-то похожее на то, как он выглядит с помощью проверки подлинности через http: // localhost: 53733/Account/Login? ReturnUrl =% 2fUser% 2fUserList. Это поможет мне получить обобщенную логику кода в jQuery для обработки проверки пользователя вместе с returnURL –