Asp.net mvc 控制器类中授权角色的继承
我创建了控制器类来协助角色授权 我有一个基类Asp.net mvc 控制器类中授权角色的继承,asp.net-mvc,inheritance,authorization,asp.net-roles,asp.net-mvc-controller,Asp.net Mvc,Inheritance,Authorization,Asp.net Roles,Asp.net Mvc Controller,我创建了控制器类来协助角色授权 我有一个基类ControllersAuthority,它是最高级别的权限。我创建了其他类来扩展每个基类 [Authorize(Roles = "Owner")] public abstract class ControllerAuthorities:Controller { } [Authorize(Roles = "Admin")] public abstract class AdminController:ControllerAuthorities { }
ControllersAuthority
,它是最高级别的权限。我创建了其他类来扩展每个基类
[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 { }
第一个问题,所有者
、管理员
和员工
角色是否有权访问销售控制器
在我的项目控制器中实现这些类时。
如果我将[Authorize]
保留为未注释状态,这会覆盖继承的权限角色吗
//[Authorize]
public class AccountController:ControllerAuthorities
{
查看
AttributeUsage
属性的Authorize
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();
第一个问题,所有者
、管理员
和员工
角色是否有权访问销售控制器
?
继承的属性是分开的,因此它们是独立应用的。要让一个用户访问SalesController
,用户必须拥有所有角色(owner
、admin
、employee
和sales
)而不是其中一个
看到两者的区别了吗
[Authorize(Roles = "Sales")]
[Authorize(Roles = "Employee")]
[Authorize(Roles = "Admin")]
[Authorize(Roles = "Owner")]
public abstract class SalesController:EmployeeController { }
及
第二个问题:如果您离开[Authorize]
时未使用相同的逻辑注释AccountController
就像
[Authorize(Roles = "Owner")]
[Authorize]
public class AccountController:ControllerAuthorities{}
因此,它不会覆盖继承的权限,只会创建authorize属性的多个用法,因为authorize
属性允许多个用法。如果Authorize
属性定义中的AllowMultiple
为false
,则派生类可以重写基类中的属性
[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 { }
所有者、管理员和员工角色是否有权访问
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访问SalesController的键
:用户应担任上述所有角色
如果我将[Authorize]
保留为未注释状态,这会覆盖
继承的权限角色
//[Authorize]
public class AccountController:ControllerAuthorities
{
是,因为AccountController
派生自ControllerAuthorities
,它需要Owner
角色
请注意MVC中的控制器只是具有一些额外功能来处理请求的类。与类
概念没有区别
提示:查看以下内容:
允许 具有其中一个角色的用户。换言之,这起作用 like或([Authorize(Roles=“Sales,Employee,Admin,Owner”)]
)操作|
允许 拥有所有角色的用户。换言之,这起作用 like And([授权(角色=“销售”、“员工”、“管理员”、“所有者”)]
)操作&
[Authorize(Roles = "Owner")]
[Authorize(Roles = "Admin")]
[Authorize(Roles = "Employee")]
[Authorize(Roles = "Sales")]
更多的澄清!请参见否,我要说的是继承属性的应用不同,因此一个用户必须具有所有者、管理员、员工和销售属性才能访问SalesController
[Authorize(Roles=“Owner,Admin,Employee,Sales”)]
告诉用户必须有其中一个才能访问SalesController。它们是不同的。@Heyyou Employee etc无权访问SalesController
,因为此控制器也需要销售角色。如果您计划通过员工角色访问salecontroller
,则必须删除salecontroller
上方的销售角色才能让其访问。您确定[Authorize]
覆盖继承属性吗?您对继承salecontroller
属性所说的是[Authorize(Roles=“销售、员工、管理、所有者”)]
。就像您所说的或
情况,那么在属性定义中有一个角色的任何用户都可以访问该控制器,而在这种情况下销售
。我认为您的回答有矛盾。@AmirHosseinMehrvarzi如果allowmultiple
为false,则[授权]
将覆盖[Authorize(Roles=“Owner”)]
。但是Authorize
属性的AttributeUsage
中的allowmultiple=true
。您可以在运行时使用var a=typeof(SalesController)来检查此项。GetCustomAttributes(true)。ToArray();
。我更新了我的答案,有一些提示你需要知道,我在我的帖子中收集到:)