Атрибут Authorize на методах действия Ajax в контроллере - PullRequest
2 голосов
/ 02 ноября 2011

Я пытался авторизовать методы действия ajax в моем приложении MVC3. Проблема возникает, когда пользовательский сеанс истекает, и метод действия ajax предлагается выполнить. Система аутентификации asp.net отправляет 302 перенаправление вместо отправки 401, что кажется логичным для не-AJAX-запросов. Но с Ajax все быстро запутывается. Поэтому я решил придерживаться подхода, предложенного на . ASP.NET MVC принудительно перенаправляет запрос AJAX на страницу входа, когда сеанс FormsLogin больше не активен . По сути, в конце запроса мы проверяем, является ли запрос ajax-запросом, и существует ли перенаправление (302 ответа). Если это так, то мы заменяем код ответа с 302 на 401. Соответственно в javascript мы проверяем на 401 и выполняем перенаправление оттуда. Вот основной код, который я поставил

В Global.asax.cs

    protected void Application_EndRequest() {
        var context = new HttpContextWrapper(Context);
        // If we're an ajax request, and doing a 302, then we actually need to do a 401
        if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) {
            Context.Response.Clear();
            Context.Response.StatusCode = 401;
        }
    }

В глобальном обработчике ошибок JQuery (включен в главную страницу asp.net mvc: _Layout.cshtml)

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
    if (jqXHR.status == 401) {
        window.location.replace(loginUrl);
    }
});

Я только что быстро протестировал этот код, и он, кажется, работает нормально Есть ли потенциальная проблема с этим кодом. Я относительно начинающий программист в том, что касается asp.net mvc и jquery, поэтому я решил спросить другие мнения, прежде чем приступить к реализации кода.

1 Ответ

3 голосов
/ 02 ноября 2011

Вот пост в блоге , который я настоятельно рекомендую вам прочитать.Это иллюстрирует лучший подход для обработки этого.

...