19

In MVC 5, you can do something like this inside an IActionFilter, to check if an attribute has been declared on the the current action (or at controller scope)

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    // Stolen from System.Web.Mvc.AuthorizeAttribute
    var isAttributeDefined = filterContext.ActionDescriptor.IsDefined(typeof(CustomAttribute), true) ||
                             filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(CustomAttribute), true);

}

So if your controller defines the attribute like so, this works.

[CustomAttribute]
public ActionResult Everything()
{ .. }

Is it possible to do the same in ASP.NET Core MVC (inside an IActionFiler)?

2
  • Keep in mind, there is no MVC6, just ASP.NET Core MVC 1.0, 1.1 and 2.0 preview ;) Commented May 26, 2017 at 10:40
  • Gah! I stand corrected! Commented May 26, 2017 at 14:49

3 Answers 3

26

Yes you can do it. Here is similar code for ASP.NET Core.

public void OnActionExecuting(ActionExecutingContext context)
{
    var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
    if (controllerActionDescriptor != null)
    {
        var isDefined = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true)
            .Any(a => a.GetType().Equals(typeof(CustomAttribute)));
    }
}
Sign up to request clarification or add additional context in comments.

2 Comments

NOTE: this uses reflection. Can be slow! Don't use this answer, look here instead: stackoverflow.com/a/60602828/56621
@AlexfromJitbit a bit discorcerning the XML comment on context.ActionDescriptor.EndpointMetadata: "This API is meant for infrastructure and should not be used by application code."
7

If you need to check the attribute, not only for a method but also for the whole controller in .NET Core, here is how I did it:

var controllerActionDescriptor = actionContext.ActionDescriptor as ControllerActionDescriptor;

if (controllerActionDescriptor != null)
{
    // Check if the attribute exists on the action method
    if (controllerActionDescriptor.MethodInfo?.GetCustomAttributes(inherit: true)?.Any(a => a.GetType().Equals(typeof(CustomAttribute))) ?? false)
        return true;

    // Check if the attribute exists on the controller
    if (controllerActionDescriptor.ControllerTypeInfo?.GetCustomAttributes(typeof(CustomAttribute), true)?.Any() ?? false)
        return true;
}

Comments

2

Try

if (context.Filters.Any(x => x.GetType() == typeof(Microsoft.AspNetCore.Mvc.Authorization.AllowAnonymousFilter)))
            return;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.