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
)?
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)));
}
}
Try
if (context.Filters.Any(x => x.GetType() == typeof(Microsoft.AspNetCore.Mvc.Authorization.AllowAnonymousFilter)))
return;
If you need to check the attribute 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;
}