重写控制器AuthorizeAttribute只需一个动作

我有一个用AuthorizeAttribute装饰的控制器。 控制器包含几个操作,除了需要CustomAuthorizeAttribute提供的一些自定义身份validation的操作之外,所有这些操作都需要身份validation。

我的问题是,一旦我在控制器级别添加了[Authorize],我可以用一个动作[CustomAuthorize]覆盖它(或删除它)吗? 还是必须从控制器级别删除[授权],并将其单独添加到其他任何操作?

我纯粹是为了方便,因为我很懒,不想用AuthorizeAttribute来装饰每一个动作。

[Authorize] public class MyController : Controller { //requires authentication public ViewResult Admin() { return View(); } //... a lot more actions requiring authentication //requires custom authentication [CustomAuthorize] //never invoked as already failed at controller level public ViewResult Home() { return View(); } } 

您可以更改其中属性运行的顺序(使用Order属性),但是我相信在这种情况下,它们仍然会运行,除非生成立即生效的结果。 关键是要在最高级别(类别)应用最less的限制性属性,并对方法进行更严格的限制。 例如,如果您希望“ Home操作公开可用,则需要从类中删除“授权”属性,并将其应用于其他每种方法。

如果行为具有相同的宽容程度,但结果不同,则更改顺序可能就足够了。 例如,您通常会redirect到“ Logon操作,但是您想要redirect到“ About操作。 在这种情况下,给出类属性Order=2Home行为属性Order=1

在MVC 5中,您可以使用新的属性OverrideAuthorization覆盖任何操作的授权。 基本上,您将其添加到具有与在控制器中定义的configuration不同的授权configuration的操作。

你这样做:

 [OverrideAuthorization] [Authorize(Roles = "Employee")] public ActionResult List() { ... } 

更多信息请见http://www.c-sharpcorner.com/UploadFile/ff2f08/filter-overrides-in-Asp-Net-mvc-5/

过了太多时间,我想出了一个解决scheme。 你需要用一个自定义的AuthorizeAttribute装饰你的控制器。

 public class OverridableAuthorize : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { var action = filterContext.ActionDescriptor; if(action.IsDefined(typeof(IgnoreAuthorization), true)) return; var controller = action.ControllerDescriptor; if(controller.IsDefined(typeof(IgnoreAuthorization), true)) return; base.OnAuthorization(filterContext); } } 

哪一个可以与Action上的IgnoreAuthorization配对

 public class IgnoreAuthorization : Attribute { }