Запустите фильтр авторизации и фильтр действий для неаутентифицированного запроса ASP.NET MVC - PullRequest
4 голосов
/ 17 марта 2010

Я украсил свой базовый контроллер парой фильтров действий. Они отлично работают.

Один из этих фильтров устанавливает запрос - например, устанавливает культуру на основе домена и т. Д.

У меня также есть несколько действий, требующих авторизации с использованием атрибута Authorize.

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

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

Я знаю, что фильтры авторизации запускаются первыми, но у меня такой вопрос: как я могу спроектировать это так, чтобы я мог гарантировать, что определенные методы всегда запускаются до возвращения представления, независимо от авторизации.

Надеюсь, что это имеет смысл.

Ответы [ 2 ]

6 голосов
/ 05 июня 2011

Согласно этой документации (под заголовком «Порядок фильтров»), фильтры авторизации всегда запускаются перед фильтрами действий. Это означает, что использование свойств Order не поможет.

Я думаю, что лучший способ справиться с этим - написать собственный атрибут авторизации (с помощью подкласса AuthorizeAttribute и переопределить AuthorizeCore) и запускать фильтры действий вручную при неудачной авторизации.

1 голос
/ 17 марта 2010

См. Порядок выполнения для фильтров действий в Статья MSDN о фильтрах действий

По сути, вы можете указать свойство Order для этих фильтров культуры, чтобы онозапускает до фильтра авторизации, что-то вроде этого:

[CultureRedirect(Order = 1)]
public class MyBaseController : Controller { }

[Authorize(Order = 2)]
public class RequiresAuth : MyBaseController { }

...

Если это не удается, вы все равно можете Выполнить код bforeдействие выполняется и перед выполнением любого ActionFilter.

...