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');
Другие вопросы по тегам