如何将[Authorize]属性设置为Controller中的一组ActionResults

时间:2015-03-11 16:15:40

标签: c# asp.net asp.net-mvc asp.net-mvc-5.2

假设我有一个控制器,其中有100个ActionResult,如下所示

public class BasicController : Controller
{ 
    public ActionResult Apple1()
    {
    }
    public ActionResult Apple2()
    {
    }
            .
            .
            .
    public ActionResult Apple100()
    {
    }



    public ActionResult Mango1()
    {
    }
    public ActionResult Mango2()
    {
    }
             .
             .
             .
    public ActionResult Mango100()
    {
    }
}

现在如何将[授权(角色=" AppleAdmin")]仅设置为Apple命名方法和[授权(角色=" MangoAdmin")]芒果命名方法?

我知道我们可以通过单独装饰每个ActionResult来实现。但我想知道的是,有没有办法set the Authorize to a Group一次ActionResults。所以这使我在上面的场景中只使用了Authorize属性两次。

2 个答案:

答案 0 :(得分:3)

假设清理控制器不是一个选项,我能想到的唯一答案是控制器上的自定义AuthorizeAttribute。 如果您覆盖OnAuthorization方法,则可以检查操作名称AuthorizationContext}的filterContext.ActionDescriptor.ActionName参数,如果逻辑失败则设置filterContext.Result = new HttpUnauthorizedResult

这样的东西
public class AppleMangoAuthorizeAttribute : AuthorizeAttibute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.ActionDescriptor.ActionName.Contains("Apple") /*&& some other failing logic*/)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
        else if (/*same for mango*/)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

然后

[AppleMangoAttribute]
public class BasicController : Controller
{
    public ActionResult Apple1() 
    {
    }
}

答案 1 :(得分:0)

我会将控制器分为2个类,只需修改路由,即可通过相同的路径访问2个控制器。

注意:我个人没有测试过这个解决方案是否会导致路由崩溃,但这是我能想到的最好的解决方案:

    [Authorize(Role="AppleAdmin")]
    [Route("BasicController")]
    public class BasicControllerApple : Controller
    {
        public ActionResult Apple1() 
        {
        }
    }

    [Authorize(Role="MangoAdmin")]
    [Route("BasicController")]
    public partial class BasicControllerMango : Controller
    {
        public ActionResult Mango1() 
        {
        }
    }