Как авторизовать набор контроллеров, не размещая аннотацию на каждом?

У меня есть наборы контроллеров, каждый из которых используется для каждого типа авторизации. Например, авторизация класса А будет иметь набор контроллеров, каждый из которых требует авторизации класса А. Есть ли способ разместить где-нибудь один атрибут [Authorize(Role="Class A")], который будет применяться к каждому из этих контроллеров, без необходимости украшать каждый контроллер одним и тем же атрибутом?


person Travis J    schedule 22.03.2012    source источник


Ответы (5)


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

[Authorize(Role="Class A")]
public class CustomBaseController : Controller{}

public class AController: CustomBaseController{}

public class BController: CustomBaseController{}
person gandil    schedule 22.03.2012
comment
Кроме того, в зависимости от количества имеющихся у вас контроллеров, вы можете так же легко поместить этот надоедливый атрибут [Authorize] вверху. Кажется, что с базовым контроллером вам все равно придется возиться с каждым контроллером. - person FrankO; 06.02.2014
comment
Да, но использование базового контроллера является лучшей практикой для инициализации и проверки некоторых данных для всех контроллеров. Возможно, вы хотите использовать собственный атрибут Authorize. Также легко внести изменения в атрибут Custom Authorize на одном контроллере. - person gandil; 16.02.2014

Да, есть способ, сделать все эти контроллеры A-class производными от одного базового контроллера и поместить на него AuthorizeAttribute:

[Authorize(Role="Class A")]
public class AController : Controller 
{
    ...
} 

public class AFirstController : AController // Gets it's parent attribute
{
    ...
} 

public class ASecondController : AController // Gets it's parent attribute
{
    ...
} 
person gdoron is supporting Monica    schedule 22.03.2012

2 или 3 ответа объясняют, как это сделать... но вы также можете использовать Fluent Security для обрабатывать все контроллеры + настройка действий в одном файле. Некоторые из преимуществ (с их веб-сайта):

Конфигурация на основе кода

Никаких атрибутов или xml, загромождающих ваш код.

Низкий отпечаток

Fluent Security не будет распространяться в вашем приложении со скоростью лесного пожара. Ваша конфигурация может храниться в одном файле.

person Romias    schedule 22.03.2012
comment
URL-адрес теперь по умолчанию является страницей парковки домена. Fluent Security все еще актуален? - person Caimen; 16.09.2016

Вы можете наследовать от базового контроллера, такого как

[Authorize(Role = "Class A")]
public class ClassARequiredController : Controller {}

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

person Jay Otterbein    schedule 22.03.2012

Установите атрибут в базовом классе и наследуйте, создавая иерархию, которая наилучшим образом соответствует вашему сценарию...

person xandercoded    schedule 22.03.2012