How to efficiently test if action is decorated with an attribute (AuthorizeAttribute)?

那年仲夏 提交于 2021-02-05 20:27:38

问题


I'm using MVC and have a situation where in my OnActionExecuting() I need to determine if the Action method that is about to execute is decorated with an attribute, the AuthorizeAttribute in particular. I'm not asking if authorization succeeded/failed, instead I'm asking does the method require authorization.

For non-mvc people filterContext.ActionDescriptor.ActionName is the method name I'm looking for. It is not, however, the currently executing method; rather, it is a method that will be executed shortly.

Currently I have a code block like below, but I'm not terribly pleased with the looping prior to every action. Is there a better way to do this?

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;
        }
    }
}

This is a little like the slightly mistitled "How to determine if a class is decorated with a specific attribute" but not quite.


回答1:


You can simply use 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



来源:https://stackoverflow.com/questions/6117392/how-to-efficiently-test-if-action-is-decorated-with-an-attribute-authorizeattri

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!