Как обрабатывать UnauthorizedRequest через Ajax-вызов в Asp.net MVC2 - PullRequest
3 голосов
/ 27 июля 2010

Коротко:

В моей структуре есть подклассифицированный атрибут AuthorizeAttribute, в котором я делаю пользовательскую авторизацию.

Я нахожусь в процессе переключения с обычного рендеринга вида asp.net mvc на рендеринг Ajax через jQuery. Следовательно, каждая ссылка в приложении выполняет ajax-вызов для получения данных.

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

Во время обычной визуализации представления, когда запрос был неавторизованным, он перенаправлялся на страницу входа, описанную в web.config. После конвертации в Ajax все немного по-другому, так как я не хочу, чтобы разметка для страницы входа в систему в запросе ajax, но мне нужен структурированный ответ, чтобы я мог действовать соответствующим образом внутри вызова ajax.

Для этого я считаю, что мне нужно переопределить метод HandleUnauthorizedRequest в подклассифицированном классе AuthorizeAttribute и установить для filterContext.Result результат json. Но при этом как бы я мог различить неавторизованный запрос и успешный запрос, потому что с точки зрения вызовов ajax оба являются успешными ответами; следовательно, будет обработан в обработчике успеха.

Как правильно решить эту проблему?

1 Ответ

7 голосов
/ 27 июля 2010

Я только что понял, я могу фильтровать между обычными и ajax-запросами в HandleUnauthorized Метод запроса, который я переопределяю в своем подклассе AuthorizeAttribute. Таким образом, для запроса ajax я могу создать результат json или что-то еще в этом отношении, а для обычных запросов все равно будет отображаться страница входа. код выглядит следующим образом:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            JsonResult UnauthorizedResult = new JsonResult();
            UnauthorizedResult.Data = "{ request : 'unauthorized' }";
            UnauthorizedResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            filterContext.Result = UnauthorizedResult;
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }

все же я не буду отмечать мой вопрос как решенный, поэтому, если кто-то может предложить лучший способ сделать это, я все еще открыт для предложений.

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