Как эффективно протестировать, если действие украшено атрибутом (AuthorizeAttribute)?
Я использую MVC и имею ситуацию, когда в моем OnActionExecuting()
мне нужно определить, будет ли метод Action, который собирается выполнить, украсить атрибутом AuthorizeAttribute
в частности. Я не спрашиваю, удалось ли авторизоваться/не удалось, вместо этого я спрашиваю, требует ли метод авторизации.
Для людей без mvc filterContext.ActionDescriptor.ActionName
- это имя метода, которое я ищу. Однако этот метод не выполняется; скорее, это метод, который будет выполнен в ближайшее время.
В настоящее время у меня есть блок кода, как показано ниже, но я не очень доволен циклом до каждого действия. Есть ли лучший способ сделать это?
System.Reflection.MethodInfo[] actionMethodInfo = this.GetType().GetMethods();
foreach(System.Reflection.MethodInfo mInfo in actionMethodInfo) {
if (mInfo.Name == filterContext.ActionDescriptor.ActionName) {
object[] authAttributes = mInfo.GetCustomAttributes(typeof(System.Web.Mvc.AuthorizeAttribute), false);
if (authAttributes.Length > 0) {
<LOGIC WHEN THE METHOD REQUIRES AUTHORIZAITON>
break;
}
}
}
Это немного похоже на слегка озаренный "Как определить, был ли класс украшен определенным атрибутом", но не совсем.
Ответы
Ответ 1
Вы можете просто использовать filterContext.ActionDescriptor.GetCustomAttributes
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
bool hasAuthorizeAttribute = filterContext.ActionDescriptor
.GetCustomAttributes(typeof(AuthorizeAttribute), false)
.Any();
if (hasAuthorizeAttribute)
{
// do stuff
}
base.OnActionExecuting(filterContext);
}
Ответ 2
var hasAuthorizeAttribute = filterContext.ActionDescriptor.IsDefined(typeof(AuthorizeAttribute), false);
http://msdn.microsoft.com/en-us/library/system.web.mvc.actiondescriptor.isdefined%28v=vs.98%29.aspx