MVC .NET Предложите пользователю войти в систему
Я в недоумении. Прямо сейчас мой сайт будет перенаправлен на страницу входа, если время сеанса пользователя истекло. Одна проблема, которую я хочу решить, - когда пользователь нажимает кнопку действия во время входа в систему, он создает запрос ajax. Я хочу уловить тайм-аут перед запуском вызова ajax, открыть модальное диалоговое окно, предлагающее пользователю ввести имя пользователя и пароль, а затем выполнить вызов ajax после успешного входа в систему. Моя главная цель - запустить вызов ajax после успешного входа в систему. Мне не обязательно создавать всплывающее окно, но я решил, что это будет лучшим способом.
Что я сделал до сих пор, так это. Я создал контроллер, цель которого в жизни - сообщить мне, есть ли тайм-аут. В функции ajaxStart() я загружаю div с результатами вызова этого контроллера. Если HTML в этом div содержит слова "Вход в систему", я вызываю window.showModalDialog. Иногда это работает, а иногда нет. Для меня это похоже на взлом, и должен быть лучший способ сделать это. Есть идеи??
function ajaxStart() {
var timeoutTest = $('#timeoutTest');
timeoutTest.load(timeoutUrl);
if (timeoutTest.html().indexOf('Log On') != -1) {
window.showModalDialog(logonUrl, "", "dialogHeight: 600; dialogWidth: 400");
}
tid = setTimeout(showSpinner, 500);
}
3 ответа
Я бы порекомендовал вам взглянуть на следующую статью, в которой Фил Хаак иллюстрирует метод, который позволит вам настроить приложение для отправки кода состояния 401, если срок действия билета для аутентификации истек, а запрос был выполнен с использованием AJAX. Тогда вы могли бы очень легко поймать этот код состояния 401 на клиенте и показать модальное диалоговое окно. Вы можете сделать это глобально для всех запросов AJAX, возникающих на странице, подписавшись на .ajaxError()
обработчик событий и обрабатывать эти ошибки в одном месте.
Проблема с использованием ошибки ajax заключается в том, что перенаправление на страницу входа не является ошибкой ajax, и вам может понадобиться использовать ее для других целей. Ваша страница входа в систему, вероятно, не всегда должна возвращать 401 IMHO, так как это на самом деле общедоступная страница.
Я удостоверяюсь, что моя страница входа возвращает специальный атрибут заголовка, который я могу искать. Мы используем много Ajax, и у вас может быть глобальный скрипт, который его ищет (что предотвратит отображение страницы и позволит вам делать то, что вам нравится).
Ваш метод контроллера страницы входа в систему будет выглядеть так:
public ActionResult LogOn()
{
Response.AddHeader("REQUIRES_AUTH", "1");
return View();
}
Тогда в глобальном масштабе, вы можете иметь эту JQuery для решения этой проблемы...
$(document).bind("ajaxComplete", function (event, request, settings) {
if (request.getResponseHeader("REQUIRES_AUTH") == "1") {
... addd popup code here.
};
});
PS причина, по которой вы не всегда работаете, заключается в том, что ваш тест тайм-аута должен был бы определить срок действия до того, как пользователь отправит сообщение. На самом деле это немного лотерея, и часто лучше всего использовать ajax. (помните, страница входа по-прежнему является действительным ответом на сообщение ajax, но не тот, который нам нужен)
Почему бы вам не добавить класс HTML в #timeoutTest
? Тогда вы можете сделать
timeoutTest.hasClass('logon');