【问题标题】:ASP.NET MVC 4 Custom Authorize filter on Controller class and Method控制器类和方法上的 ASP.NET MVC 4 自定义授权过滤器
【发布时间】:2018-09-28 19:31:52
【问题描述】:

我确实看到了这个stackoverflowQuestion,但这围绕着使用 Authorize 属性。我通过扩展 AuthorizeAttribute 使用自定义授权属性。

我希望能够将此自定义过滤器放置在控制器类的顶层,但是对于几个方法,只强制执行特定角色,而不是顶层和操作方法角色。

所以,

[AuthorizeUser("Transact")]
public class HomeController : Controller
{
    //
    // GET: /Search/Home/

    public ActionResult Index()
    { 
        return View();
    }

    [AuthorizeUser("Search")]
    public ActionResult Search()
    { 
        return View();
    }

}

执行此操作,框架将检查用户是否同时具有 Transact 和 Search 角色。我只想检查此场景中的搜索角色。

我在另一个区域重用了这个搜索功能和部分视图。

【问题讨论】:

    标签: asp.net-mvc-4 c#-3.0 authorize-attribute


    【解决方案1】:

    回到我发布的链接:stackoverflowQuestion 我能够让它在我的情况下工作。似乎正在发生的是对我的操作的调用首先从控制器级别查看属性,但是在 OnAuthroization 方法中使用 filterContext.ActionDescriptor.IsDefined 会告诉我被调用的操作是否附加了我的覆盖属性。如果是,它会跳过调用 base.OnAuthorization 方法,然后调用 override 属性。

    所以,我要做的是创建覆盖类并扩展我的自定义授权类。我在父类中声明了一个标志,并在覆盖类的构造函数中设置,以告诉我覆盖授权方法是否正在调用我的自定义授权类的授权方法。

    这是一个让所有事情都有意义的例子。

    public class AuthorizeUserAttribute : AuthorizeAttribute
    {
        protected bool isOverrideAuthorize = false;
    
        public AuthorizeUserAttribute(params...)
        {
        }
    
        public AuthorizeUserAttribute(MenuItems...)
        {
        }
    
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var action = filterContext.ActionDescriptor;
            if (action.IsDefined(typeof(OverrideAuthorizeUserAttribute), true) && !isOverrideAuthorize)
            {
                return;
            }
    
            base.OnAuthorization(filterContext);
        }
    
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
    
        }
    
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
        }
      }
    

    覆盖类:

    public class OverrideAuthorizeUserAttribute : AuthorizeUserAttribute
    {
        public OverrideAuthorizeUserAttribute(params...) : base(roles)
        {
            base.isOverrideAuthorize = true;
        }
    
        public OverrideAuthorizeUserAttribute(MenuItems...) : base(item)
        {
            base.isOverrideAuthorize = true;
        }
    
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return base.AuthorizeCore(httpContext);
        }
    }
    

    这允许我仅根据在该操作上声明的授权属性对操作进行授权,而不是框架默认的控制器和操作方法上的授权属性。

    此外,MVC5 似乎通过包含“OverrideAuthorization”属性解决了这个问题。不幸的是,我仍在使用 MVC4。

    【讨论】:

      【解决方案2】:

      您可以像下面这样在控制器顶部尝试,这将支持单个控制器的多个角色,或者您可以在每个操作的顶部使用相同的 Authorize(Roles = "Admin") 过滤器......

      [Authorize(Roles = "Admin,HRManager,Finance")]
      Public class MyController:Controller{
      
        // inside controller action methods
       }
      

      【讨论】:

        猜你喜欢
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多