Я поддерживаю сайт 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
- это класс Attribute, используемый для оформления действий нашего контроллера и описания безопасного доступа, необходимого для этой функции:
//User needs to have VIEW privileges to REPORTS area:
[ControllerSecurity("REPORTS", "VIEW")]
public ActionResult Index(){...}
Должен быть лучший способ сделать это без переписывания защиты. Я хотел бы с уверенностью знать, что мы проверяем только метод, который в конечном итоге будет запущен.
Я просмотрел объект AuthorizationContext
и никак не могу найти надежный метод действия, который в конечном итоге будет вызван.
У кого-нибудь есть идеи?