如何有效地测试动作是否使用属性(AuthorizeAttribute)进行修饰?

时间:2011-05-24 21:54:09

标签: c# asp.net-mvc asp.net-mvc-2 reflection c#-4.0

我正在使用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;
        }
    }
}

这有点像有点迷茫的“How to determine if a class is decorated with a specific attribute”但不完全。

2 个答案:

答案 0 :(得分:37)

你可以简单地使用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);
}

答案 1 :(得分:8)

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