控制器类中授权角色的继承

时间:2015-09-23 13:46:27

标签: asp.net-mvc inheritance authorization asp.net-roles asp.net-mvc-controller

我已经创建了控制器类来协助角色授权。

我有一个基类ControllersAuthorities,这是最高级别的权限。我已经创建了其他类来扩展每个基类。

[Authorize(Roles = "Owner")]
public abstract class ControllerAuthorities:Controller { }
[Authorize(Roles = "Admin")]
public abstract class AdminController:ControllerAuthorities { }

[Authorize(Roles = "Employee")]
public abstract class EmployeeController:AdminController { }
[Authorize(Roles = "Sales")]
public abstract class SalesController:EmployeeController { }

首先,OwnerAdminEmployee角色是否可以访问SalesController

在我的项目控制器中实现这些类时。 如果我将[Authorize]取消注释,是否会覆盖继承的权限角色?

//[Authorize]
public class AccountController:ControllerAuthorities
{

2 个答案:

答案 0 :(得分:13)

查看AttributeUsage attributeAuthorize属性;

[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method, 
    Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter

Inherited= true表示使用此属性修饰的类的子类可以继承此属性。

AllowMultiple=true表示此属性可以多次放置在同一个实体上。

使用继承的属性并允许使用相同的属性,SalesController可以视为

[Authorize(Roles = "Sales")]
[Authorize(Roles = "Employee")]
[Authorize(Roles = "Admin")]
[Authorize(Roles = "Owner")]
public abstract class SalesController:EmployeeController { }

您可以使用此代码在运行时测试它。

var a = typeof(SalesController).GetCustomAttributes(true).ToArray();

第一个问题OwnerAdminEmployee角色是否可以访问SalesController? 继承的属性是分开的,因此它们可以独立应用。对于要访问SalesController的一个用户,用户必须拥有所有角色(owneradminemployeesales )不是其中之一。

查看

之间的区别
[Authorize(Roles = "Sales")]
[Authorize(Roles = "Employee")]
[Authorize(Roles = "Admin")]
[Authorize(Roles = "Owner")]
public abstract class SalesController:EmployeeController { }

[Authorize(Roles = "Owner,Admin,Employee,Sales")]
public abstract class SalesController:EmployeeController { }

第二个问题:如果您将[Authorize]取消注释,使用相同的逻辑AccountController就像

[Authorize(Roles = "Owner")]
[Authorize]
public class AccountController:ControllerAuthorities{}

因此,它不会覆盖继承的权限,只会创建authorize属性的多次使用,因为Authorize属性允许多次使用。如果AllowMultiplefalse属性定义中为Authorize,则派生类可以覆盖基类中的属性。

答案 1 :(得分:4)

  

所有者管理员员工角色是否可以访问   SalesController

不,他们无法访问SalesController。继承使您的代码如下:

[Authorize(Roles = "Owner")]
public abstract class ControllerAuthorities:Controller { }
[Authorize(Roles = "Admin", "Owner")]
public abstract class AdminController:Controller { }

[Authorize(Roles = "Employee", "Admin", "Owner")]
public abstract class EmployeeController:Controller { }
[Authorize(Roles = "Sales", "Employee", "Admin", "Owner")]
public abstract class SalesController:Controller { }

由于SalesController需要额外的角色,因此无法访问名为 Sales Sales 访问权限SalesController用户应处于所有提及的角色中。

  

如果我将[Authorize]取消注释,那么这会覆盖   继承权限角色?

是的,因为AccountController来自ControllerAuthorities,需要Owner个角色。

请注意 MVC中的控制器只是具有一些其他功能来处理请求的类。与class概念没有区别。

提示:请查看以下内容:

  • [Authorize(Roles = "Sales, Employee, Admin, Owner")]允许 具有其中一个角色的用户。换句话说,这是行为 喜欢 OR ||)操作。
  • [Authorize(Roles = "Sales", "Employee", "Admin", "Owner")]允许 具有所有角色的用户。换句话说,这是行为 喜欢&)操作。

最后一个就像你的问题。这也等于以下内容:

[Authorize(Roles = "Owner")]
[Authorize(Roles = "Admin")]
[Authorize(Roles = "Employee")]
[Authorize(Roles = "Sales")]

有关此内容的更多说明!见How to authorize a set of controllers without placing the annotation on each one?