Несанкционированный результат в запросах ajax - PullRequest
17 голосов
/ 08 марта 2012

У меня есть приложение со многими действиями ajax (реализовано с использованием JQuery.ajax), которое возвращает JSON или html. Некоторые из них должны быть доступны только авторизованным пользователям, и я украсил их атрибутом [Authorize]. Если действия не ajax, если пользователь не авторизован - система перенаправляет его на страницу входа (настроенную в web.config).

Но это не относится к действиям ajax, потому что, если пользователь авторизован - он загружает страницу, после того, как истекает срок действия этого cookie, и он не авторизован, и вместо блока html, который должен заменить старый, он получает мою страницу входа в блок ,

Я знаю, что могу решить эту проблему вручную, например, удалить атрибут [Authorize] и вернуть специальный json / empty html, если пользователь не авторизован. Но мне не нравится это решение, потому что мне нужно переписать все мои действия и функции ajax. Мне нужно глобальное решение, которое позволит мне не переписывать свои действия (может быть пользовательский атрибут авторизации или некоторая пользовательская обработка неавторизованного результата http).

Я хочу вернуть код состояния, если запрос ajax, и перенаправить на страницу входа, если запрос не ajax.

Ответы [ 4 ]

31 голосов
/ 08 марта 2012

Добавьте обработчик Application_EndRequest к своему коду в global.asax.cs, который изменяет любую ошибку 302 (перенаправление на страницу входа в систему) на ошибку 401 (неавторизованную) для запроса AJAX.Это позволит вам просто оставить действия вашего контроллера такими, какие они есть, и обрабатывать перенаправление (вы действительно можете только снова войти в систему, если он не зарегистрирован) через клиента.

protected void Application_EndRequest()
{
    // Any AJAX request that ends in a redirect should get mapped to an unauthorized request
    // since it should only happen when the request is not authorized and gets automatically
    // redirected to the login page.
    var context = new HttpContextWrapper( Context );
    if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
    {
        context.Response.Clear();
        Context.Response.StatusCode = 401;
    }
}

Тогда в вашем_Layout.cshtml файл добавляет глобальный обработчик ошибок AJAX, который перенаправляет на ваше действие входа в систему, когда он получает ответ 401.* Предотвратить перенаправление страницы входа с проверкой подлинности с помощью форм, если вы этого не хотите

1 голос
/ 08 марта 2012

Вам не нужно переписывать все свои действия, просто создайте собственный фильтр для замены встроенного фильтра Authorize.

Другие люди делали это раньше

asp.net mvc [handleerror] [авторизоваться] с JsonResult?

0 голосов
/ 08 марта 2012

Может быть, ваше действие LogOn в вашем AccountController (или там, где он у вас есть) может вернуть другой результат, если Request.IsAjaxRequest() было истинно.

Это означает, что если вызов AJAX для авторизованного действия не проходит авторизацию, вы должны иметь возможность вернуть соответствующий ответ через действие LogOn.

, например

public ActionResult LogOn()
{
    if (Request.IsAjaxRequest())
    {
        // do appropriate response for ajax call here
    }

    return View();
}

Тогда вам не нужно делать большую переписку

0 голосов
/ 08 марта 2012

Вы можете проверить метод расширения Request.IsAjaxRequest () и предпринять определенные действия, если оно истинно.

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