Asp.net mvc 4 ASP.NET MVC 4控制器类和方法上的自定义授权筛选器

Asp.net mvc 4 ASP.NET MVC 4控制器类和方法上的自定义授权筛选器,asp.net-mvc-4,c#-3.0,authorize-attribute,Asp.net Mvc 4,C# 3.0,Authorize Attribute,我确实看到了这一点,但这围绕着使用,Authorize属性。我通过扩展AuthorizeAttribute使用自定义authorize属性 我希望能够将此自定义筛选器放置在控制器类的顶层,但对于一些方法,它们只强制执行特定的角色,而不是同时执行顶层和操作方法角色 所以 执行此操作时,框架将检查用户是否同时拥有Transact和Search角色。。我只想检查一下这个场景中的搜索角色 我正在另一个领域重用此搜索功能和partialview 回到我发布的链接:我能够让它在我的情况下工作。似乎正在发生的

我确实看到了这一点,但这围绕着使用,Authorize属性。我通过扩展AuthorizeAttribute使用自定义authorize属性

我希望能够将此自定义筛选器放置在控制器类的顶层,但对于一些方法,它们只强制执行特定的角色,而不是同时执行顶层和操作方法角色

所以

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


我正在另一个领域重用此搜索功能和partialview

回到我发布的链接:我能够让它在我的情况下工作。似乎正在发生的是对my action的调用首先从控制器级别查看属性,但是使用OnAuthroization方法中定义的filterContext.ActionDescriptor.IsDefined将告诉我调用的操作是否附加了my override属性。如果它跳过调用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);
    }
}
这允许我仅对该操作上声明的authorization属性而不是框架默认的控制器和操作方法上的authorization属性对该操作进行授权


此外,MVC5似乎通过包含“OverrideAuthorization”属性来解决此问题。。不幸的是,我仍然在MVC4上。

您可以在控制器顶部尝试,如bellow,这将支持单个控制器的多个角色,或者您可以在每个操作的顶部使用相同的授权(Roles=“Admin”)过滤器

[Authorize(Roles = "Admin,HRManager,Finance")]
Public class MyController:Controller{

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

  // inside controller action methods
 }