Запустите фильтр авторизации и фильтр действий для неаутентифицированного запроса ASP.NET MVC.

StackOverflow https://stackoverflow.com/questions/2459735

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

...

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top