Я поддерживаю сайт ASP.NET MVC, где они делают свою собственную безопасность. Таким образом, они создали класс, полученный от AuthorizeAttribute
. В OnAuthorization
у них есть код отражения, который находит метод на основе имени action
в RouteData
.Найти метод, который будет выполняться в контроллере с использованием отражения
Проблема, которую я вижу, что если у вас есть несколько функций в контроллере, которые отличаются только AcceptVerb
или параметров, это можно не авторизовать пользователя:
IList<MethodInfo> methods = filterContext.Controller.GetType().GetMethods().Where(i=>i.Name == action).ToList();
foreach (MethodInfo method in methods)
{
//get all of the controller security properties, and check for access:
object[] props = method.GetCustomAttributes(typeof(ControllerSecurity), false);
foreach (ControllerSecurity prop in props)
{
//does the user have access to this area/action?
authorized = security.ValidateUserForAction(prop.SecurityArea, prop.SecurityAction);
//if we are authorized by one ControllerSecurity, then we are good.
if (authorized)
{
break;
}
}
}
ControllerSecurity
класс класс Атрибут используется для украшения наших действий контроллера и описания доступа к безопасности, необходимые для этой функции:
//User needs to have VIEW privileges to REPORTS area:
[ControllerSecurity("REPORTS", "VIEW")]
public ActionResult Index(){...}
Там должен быть лучший способ сделать это, не переписывая безопасности. Я хотел бы знать с некоторой определенностью, что мы проверяем только метод, который в конечном итоге будет запущен.
Я просмотрел объект AuthorizationContext
и не могу найти все равно, чтобы надежно найти метод действия, который в конечном итоге будет вызван.
У кого-нибудь есть идеи?
Поскольку атрибуты находятся в самих действиях, вы можете не просто перебирать все атрибуты действий, пока не найдете тот, на котором вы фактически работаете? –
Но если у меня есть два действия «Index» в моем контроллере, каждый с разными параметрами, каждый из них может иметь разные атрибуты безопасности. (Наверное, это не произойдет на практике, но мне нравится, чтобы код безопасности был максимально плотным) – mlsteeves
Дополнительная информация здесь: http://stackoverflow.com/questions/2168942/c-custom-attributes-how-to-get-the -member-type-to-which-an-attribute-was-appl –