Controller类和方法上的ASP.NET MVC 4自定义授权过滤器

问题描述 投票:1回答:2

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

我希望能够将此自定义筛选器放在控制器类的顶级,但是有两种方法只强制执行特定角色,而不是顶级和操作方法角色。

所以,

[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
2个回答
1
投票

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

所以,我要做的是创建override类并扩展我的自定义授权类。我在父级中声明了一个标志,并在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。


0
投票

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

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

  // inside controller action methods
 }
© www.soinside.com 2019 - 2024. All rights reserved.