首页 文章

覆盖控制器AuthorizeAttribute只执行一个操作

提问于
浏览
49

我有一个用AuthorizeAttribute修饰的控制器 . 除了一个需要CustomAuthorizeAttribute提供的自定义身份验证的操作外,控制器还包含几个需要身份验证的操作 .

我的问题是,一旦我在控制器级别添加[授权],我可以使用[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();
  }

}

3 回答

  • 21

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

    如果动作具有相同的允许水平,但具有不同的结果,则更改顺序可能就足够了 . 例如,您通常会重定向到 Logon 操作,但对于 Home ,您想要重定向到 About 操作 . 在这种情况下,case给出类属性 Order=2Home action属性 Order=1 .

  • 12

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

    你这样做:

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

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

    In ASP.NET Core 2.1 没有OverrideAuthorization属性,你唯一能做的就是匿名行动,即使控制器没有 . 更多信息,请致电https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-2.1

    一种选择是这样做:

    [Authorize(Roles = "Admin,Employee")] // admin or employee
    public class XController : Controller 
    {
        [Authorize(Roles = "Admin")] // only admin
        public ActionResult ActionX() { ... }
    
        [AllowAnonymous] // anyone
        public ActionResult ActionX() { ... }
    }
    
  • 89

    经过太多时间,我想出了一个解决方案 . 您需要使用自定义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上的 AllowAnonymous 配对

    [AllowAnonymous]
    

相关问题