Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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
C# ASP.NET标识2分层角色_C#_Asp.net Mvc_Authorization_Asp.net Identity - Fatal编程技术网

C# ASP.NET标识2分层角色

C# ASP.NET标识2分层角色,c#,asp.net-mvc,authorization,asp.net-identity,C#,Asp.net Mvc,Authorization,Asp.net Identity,我正在用Identity 2.0框架构建一个ASP.NET MVC应用程序。我已经在SQL Server上的AspNet*表中添加了用户和角色。以下是角色示例: 财务 一般的 争吵者 管理层 系统管理员 拥有SystemAdmin的人拥有所有其他角色管理包括争吵者和财务 在AspNetUserRoles上分配这些角色时,我不愿意列出每个用户的每个组合。有没有办法让一个角色成为一组角色或一个层次结构?因此,当我运行User.IsInRole(“财务”)时,对于被分配了SystemAdmin角色

我正在用Identity 2.0框架构建一个ASP.NET MVC应用程序。我已经在SQL Server上的
AspNet*
表中添加了用户和角色。以下是角色示例:

  • 财务
  • 一般的
  • 争吵者
  • 管理层
  • 系统管理员
拥有
SystemAdmin
的人拥有所有其他角色<代码>管理包括
争吵者
财务

AspNetUserRoles
上分配这些角色时,我不愿意列出每个用户的每个组合。有没有办法让一个角色成为一组角色或一个层次结构?因此,当我运行
User.IsInRole(“财务”)
时,对于被分配了
SystemAdmin
角色的用户来说是真的吗?谢谢。

假设这些角色是“按原样”的,并且此处的角色列表是所有角色,那么您可以将其转换为基于标志的枚举,并且一组角色的表示可以作为整数存储在数据库中

下面是它的工作原理

public enum Role
{
   Finance = 1
   General = 2
   SquadLeader = 4
   Management = 8 
   SystemAdmin = 16
}
当应用到我的业务逻辑时,我可以说像

var genAndSysAdmin = 18;
var genAndSysAdminFlags = Role.General || SystemAdmin;
使用它,您可以在用户对象上有一个“Role”类型的“RoleFlags”变量,并执行如下检查

User.Roles.HasFlag(Role.Management) 
。。。检查用户是否处于给定角色。 换句话说,在您的示例中,如果用户在拥有sysAdmin时拥有所有其他角色,那么标志值将是

var allRoles = 16 + 8 + 4 + 2 + 1;
。。。基本上,这就像一个简单的位图

然而

不建议我们以这种方式设计安全模型

相反,我们应该创建一个正常的角色结构,但也允许角色有一个子角色集合和一个父角色

这将允许更典型的设计,类似LDAP/Active Directory类型的设置

public class Role
{
    [Key]
    public Guid Id { get; set; }
    [ForeignKey("Parent")]
    public Guid ParentId { get; set; } 
    [Required]
    public string Name { get; set; }
    public virtual Role Parent { get; set; }
    public ICollection<User> Users { get; set; }
    public ICollection<Role> Children { get; set; }
}

public class User 
{
   [Key]
   public Guid Id { get; set; }
   ...
   public ICollection<Role> Roles { get; set; }
}

。。。通过这种方式,您可以灵活地继承任何给定父角色中所有子角色的权限级别,还可以将您的权限视为您试图模拟的层次结构,同时采用更典型的模式,允许您在将来添加新角色。

对于内置类,不,没有办法。您需要创建自己的实现谢谢@CamiloTerevinto。很遗憾,内置类非常有限。我发现自己大部分时间都在编写自己的商店/用户/角色实现。希望有人能为此提供nuget软件包:)也许这篇文章会有所帮助:谢谢,@War,给出了很好的答案。希望您不介意编辑这两个类的格式。后续问题:如何将这些角色绑定到SQL Server上Identity Framework的
AspNetRoles
表中,该表为角色ID分配自己的GUID?我支持Alex的问题。绑定?在您的代码中,通常建议您按名称引用角色,因此id值只是一个您不关心的实现细节,但如果重要的是您可以在框架中实现自己的iuser和irole版本,那么您可以选择要实现的接口,以用自己的接口替换其功能的子集。
new Role { Id = 1, Name = "SystemAdmin" }
new Role { Id = 2, Name = "Management", ParentId = 1 }
new Role { Id = 3, Name = "SquadLeader", ParentId = 2 }
...