在控制器级别按角色访问

Access by roles at controller level

MVC 是否可以允许一个角色访问整个控制器除了一个或几个方法被另一个角色访问?

其中除Method3 之外的所有方法都属于员工,客户和员工都可以访问。如下所示:

    [Authorize(Roles = "staff")]
    public class StaffController : Controller
    {
        public StaffController()
        {
        }
        public ActionResult Method1()
        {
        }
        public ActionResult Method2()
        {
        }
        [Authorize(Roles = "staff, customer")]
        public ActionResult Method3()
        {
        }
    }

或者另一种情况,除 Method3 外,所有内容都属于员工,客户只能访问它,如下所示:

    [Authorize(Roles = "staff")]
    public class StaffController : Controller
    {
        public StaffController()
        {
        }
        public ActionResult Method1()
        {
        }
        public ActionResult Method2()
        {
        }
        [Authorize(Roles = "customer")]
        public ActionResult Method3()
        {
        }
    }

但是,上面的方法不起作用。在这两种情况下,客户仍然无法访问 Method3。

非常感谢任何帮助!

我怀疑它首先检查控制器授权,因此永远没有机会检查特定操作以获得授权。

一种解决方案是在 class 级别授权两个角色,并将对特定方法的访问权限限制为 staff

例如

[Authorize(Roles="staff,customer")]
public class StaffController : Controller
{
    [Authorize(Roles="staff")]
    public StaffController()
    {
    }
    [Authorize(Roles="staff")]
    public ActionResult Method1()
    {
    }
    [Authorize(Roles="staff")]
    public ActionResult Method2()
    {
    }
    public ActionResult Method3()
    {
    }
}

另一种选择是 Restrict(即 Authorize 的对立面)使用此答案中的自定义属性之类的东西 ASP.NET MVC: Opposite of [Authorise] 但正如他们提到的那样,这违背了 MVC 安全性的 "refuse by default" 原则。