Вот что я бы сделал, аналогично ответу Крейга с парой изменений:
1) Создайте обычный атрибут, производный от System.Attribute (нет необходимости выводить из FilterAttribute, поскольку вы не собираетесь использовать ничего, что обеспечивает FilterAttribute).
Возможно, создайте иерархию классов атрибутов, чтобы вы могли проводить тестирование на основе этой иерархии, например,
Attribute
AuthorizationAttribute
AuthorizationNotRequiredAttribute
AuthorizationAdminUserRequiredAttribute
AuthorizationSuperUserRequiredAttribute
2) В вашем BaseController переопределите метод OnAuthorization
вместо метода OnActionExecuting
:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
var authorizationAttributes = filterContext.ActionDescriptor.GetCustomAttributes(true).OfType<AuthorizationAttribute>();
bool accountRequired = !authorizationAttributes.Any(aa => aa is AuthorizationNotRequiredAttribute);
Мне нравится подход обеспечения безопасности по умолчанию: даже если вы забудете указать атрибут в действии, он по крайней мере потребует входа пользователя в систему.