Как эффективно проверить, украшено ли действие атрибутом (AuthorizeAttribute)? - PullRequest
15 голосов
/ 25 мая 2011

Я использую 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;
        }
    }
}

Это немного похоже на слегка ошибочное " Как определить, украшен ли класс определенным атрибутом ", но не совсем.

Ответы [ 2 ]

37 голосов
/ 25 мая 2011

Вы можете просто использовать 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);
}
8 голосов
/ 15 ноября 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...