Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 控制器类中授权角色的继承_Asp.net Mvc_Inheritance_Authorization_Asp.net Roles_Asp.net Mvc Controller - Fatal编程技术网

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中的控制器只是具有一些额外功能来处理请求的类。与
概念没有区别

提示:查看以下内容:

  • [Authorize(Roles=“Sales,Employee,Admin,Owner”)]
    允许 具有其中一个角色的用户。换言之,这起作用 like或(
    |
    )操作
  • [授权(角色=“销售”、“员工”、“管理员”、“所有者”)]
    允许 拥有所有角色的用户。换言之,这起作用 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();
。我更新了我的答案,有一些提示你需要知道,我在我的帖子中收集到:)