MVC 3, JQuery AJAX и формы аутентификации - PullRequest
6 голосов
/ 31 июля 2011

В моем проекте MVC3 у меня есть контроллер с атрибутом [Authorize].У меня есть отправка формы без ajax, которая перенаправляет пользователя (как и ожидалось) на экран входа в систему, если он / она не вошел в систему.

Однако теперь у меня есть форма, которая отправляется с помощью jquery ajax,и как я могу сделать то же самое?Перенаправить пользователя на экран входа в систему, если он не авторизован?После успешного входа в систему пользователь должен быть перенаправлен на начальное действие.

Контроллер

[Authorize]
[ValidateInput(false)] 
public JsonResult SubmitChatMessage(string message)
        {
            if (!string.IsNullOrEmpty(message))
            {
                // Do stuff
            }

            // Return all chat messages
            return GetChatMessages();
        }

Клиент JQUERY

$(document).ready(function () {
    $("form[action$='SubmitChatMessage']").submit(function (event) {
        $.ajax({
            url: $(this).attr("action"),
            type: "post",
            dataType: "json",
            data: $(this).serialize(),
            success: function (response) {
                // do stuff
            }
        });
        return false; 
    });
});

Я вижу из окна консоли firebug, что сервервозвращает:

GET http://domain/Account/LogOn?ReturnUrl=%2fProductDetails%2fSubmitChatMessage

Ждем вашей помощи!

ОБНОВЛЕНО возможными решениями

Ответы [ 2 ]

6 голосов
/ 02 августа 2011

Да, это одна из вещей, которые я всегда ненавидел об аутентификации с помощью форм в ASP.NET - вообще не обслуживает AJAX-аутентификацию. Добавьте IIS, обрабатывающий 401, в смесь, и это может быть довольно болезненным.

Есть несколько способов сделать это, ни один из них не является "чистым".

К ним относятся:

  1. Установите флаг ViewBag в контроллере, который соответствует Request.IsAuthenticated, затем переписайте событие нажатия кнопки отправки на страницу входа, если они не аутентифицированы.

  2. Сделайте, чтобы ваше действие AJAX возвращало JsonResult, что является свойством для "кода". Если код 0 может быть успешным, 1 может быть не аутентифицирован, 2 может быть какой-то другой проблемой с данными и т. Д. Затем проверьте этот код в обратном вызове complete $.ajax и перенаправьте на страницу входа.

  3. Проверьте объект ответа $.ajax jqXHR для кода состояния 403 и перенаправьте на страницу входа.

  4. Напишите пользовательский помощник HTML для кнопки отправки, который отображает либо обычную кнопку отправки, либо тег привязки, который переходит на страницу входа в зависимости от статуса аутентификации.

  5. Напишите пользовательский атрибут авторизации, который проверяет, если Request.IsAjaxRequest(), и возвращает пользовательский объект JSON вместо поведения по умолчанию, которое заключается в перенаправлении на страницу входа (что не может происходить для запросов AJAX).

0 голосов
/ 31 июля 2011

Это немного больно, если честно. Тем более, на мой взгляд, если вы используете Federated Identity, например Windows Identity Foundation и / или Azure AppFabric Access Control Service.

Ваши Ajax-вызовы не могут обработать перенаправление.

Мое решение / предложение не в том, чтобы пометить методы действия контроллера, вызванного Ajax, с помощью [Авторизовать], а вместо этого полагаться на наличие некоторого значения, которое вы вставляете в Состояние Сеанса из действия контроллера, у которого действительно есть [Авторизовать] ( обычно метод действия контроллера, который был вызван для отображения представления). Вы знаете, что значение не может попасть в состояние сеанса, если пользователь не прошел аутентификацию (а время сеанса не истекло). Сбой при вызове вашего метода Ajax, если это значение отсутствует, возвращая конкретный результат JSON, который вы можете изящно обработать в коде на стороне клиента.

Использование [Authorize] в методе контроллера Ajax вызывает странные, часто скрытые ошибки (например, исчезновение обновлений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...