C# ASP.NET标识2分层角色
我正在用Identity 2.0框架构建一个ASP.NET MVC应用程序。我已经在SQL Server上的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角色
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 }
...