4

Я украсил мой базовый контроллер несколькими фильтрами действий. Они отлично работают.Запуск обоих фильтров авторизации и фильтра действий при неавторизованном запросе ASP.NET MVC

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

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

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

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

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

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

ответ

5

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

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

+0

Спасибо. Я позже нашел это и закончил тем, что вы рекомендовали в любом случае. –

1

См порядок выполнения действий Фильтры на MSDN Article on Action Filter

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

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

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

...

Если это не удается, вы все равно можете Execute code bfore an action executes и перед выполнением любого ActionFilter.

Смежные вопросы