Я пытаюсь защитить свои маршруты MVC от набора пользователей, соответствующих набору критериев. Поскольку MVC, похоже, использует атрибуты совсем немного, и Стивен Сандерсон использует один для повышения безопасности в своей книге pro MVC, я начал продвигаться по этому маршруту, но я бы хотел определить правило в контексте, основанного на действии, к которому я его применяю.Передача Func в качестве параметра атрибута для защиты маршрутов MVC
Некоторые действия предназначены только для сотрудников, а некоторые нет.
Некоторые действия предназначены только для компании1, некоторые нет.
Так я думал, этот тип использования ...
[DisableAccess(BlockUsersWhere = u => u.Company != "Acme")]
public ActionResult AcmeOnlyAction()
{
...
}
[DisableAccess(BlockUsersWhere = u => u.IsEmployee == false)]
public ActionResult EmployeeOnlyAction()
{
...
}
Выглядит довольно чистый для меня, и это действительно довольно легко реализовать, но я получаю следующее сообщение об ошибке компилятора:
«BlockUsersWhere» не является допустимым аргументом имени атрибута, поскольку он не является допустимым параметром атрибута типа
По-видимому, вы не можете использовать аргумент Func как атрибут. Любые другие предложения, чтобы обойти эту проблему или что-то еще, что обеспечивает простое использование, которое мы полюбили в наших проектах MVC?
Спасибо, это первое, о чем я думал, но при таком подходе я теряю возможность создавать уникальные правила на основе контекста, не обновляя также класс атрибута. Я, скорее всего, поеду по этому маршруту. – jjr2527
Да, атрибуты могут передавать только ограниченный объем информации. Они действительно должны только назначать метаданные. Более сложное поведение принадлежит коду. – marcind