我已经创建了控制器类来协助角色授权。
我有一个基类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 { }
首先,Owner
,Admin
和Employee
角色是否可以访问SalesController
?
在我的项目控制器中实现这些类时。
如果我将[Authorize]
取消注释,是否会覆盖继承的权限角色?
//[Authorize]
public class AccountController:ControllerAuthorities
{
答案 0 :(得分:13)
查看AttributeUsage
attribute的Authorize
属性;
[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();
第一个问题,Owner
,Admin
和Employee
角色是否可以访问SalesController
?
继承的属性是分开的,因此它们可以独立应用。对于要访问SalesController
的一个用户,用户必须拥有所有角色(owner
,admin
,employee
和sales
)不是其中之一。
查看
之间的区别[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
属性允许多次使用。如果AllowMultiple
在false
属性定义中为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?