重写控制器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=2
和Home
行为属性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 { }
- ASP.NET MVC – 附加types“MODELNAME”的实体失败,因为另一个相同types的实体已经具有相同的主键值
- 具有相同密钥的项目已被添加
- 值不能为空。 参数名称:值,CreateIdentityAsync?
- 如何解决相对于ASP.NET MVC 4应用程序根目录的path?
- 根据点击的提交button,将表单发布到不同的MVC发布操作
- 从传递给部分视图的嵌套复杂对象中获取值
- 403 – 禁止:访问被拒绝。 ASP.Net MVC
- 使用AngularJS的ASP.NET MVCvalidation表单
- 没有MediaTypeFormatter可用于从媒体types为“text / plain”的内容读取“String”types的对象,