代码之家  ›  专栏  ›  技术社区  ›  Fede Antuña

C#ASP。NET Identity 2(.NET Framework MVC)-使用权限和角色

  •  0
  • Fede Antuña  · 技术社区  · 8 年前

    我正在尝试制作一个权限/角色授权应用程序。我的想法是混合角色和权限,以便管理员可以创建具有不同权限的不同角色来做一些事情。

    实例

    我想把这样的东西放在我的控制器中:

    namespace MyApp.Controllers
    {
        public class SettingsController : Controller
        {
            // All the ASP.NET Identity UserManager, SignInManager
            and RoleManager configuration
    
           [HasPermission(Permission = "SensitiveData")]
           // GET: /Settings/SensitiveData
           public ActionResult SensitiveData()
           {
               // Collect some information to display
               return View()
           }
    
           [HasPermission(Permission = "ListUsers")]
           // GET: /Settings/ListUsers
           public ActionResult ListUsers()
           {
               // Collect some information to display
               return View()
           }
        }
    }
    

    AspNetPermissions将具有Id和权限字段。AspNetRolePermissions将具有RoleId和PermissionId。

    管理员用户可以创建、编辑或删除角色。角色将成为分组权限的友好方式。因此,例如,我希望允许维护角色下的所有用户使用我以前的控制器中的“SensitiveData”和“ListUsers”操作,并允许营销角色下的用户仅使用“ListUsers”操作。我将从管理员帐户创建角色“维护”,将设置权限添加到“SensiveData”和“ListUsers”。然后,我将遵循相同的概念创建“营销”角色,因此de DBs看起来像:

    -------------------------------
           AspNetPermissions*
    -------------------------------
    Id             | Permission
    ---------------|---------------
    permissionId1  | SensitiveData
    permissionId2  | ListUsers
    ...            | ...
    

    *这是预加载的,即使管理员也不能创建权限

    -------------------------------
           AspNetRolePermissions
    -------------------------------
    RoleId         | PermissionId
    ---------------|---------------
    maintenanceId  | permissionId1
    maintenanceId  | permissionId2
    marketingId    | permissionId2
    

    最后,我将为一些用户添加角色(这一部分我已经完成了)。

    我不能做到的是:

    1. 创建AspNetPermissions和AspNetRolePermissions
    2. 创建AspNetRolePermissions与AspNetPermissions和AspNetRoles之间的关系
    3. 创建过滤器HasPermission(Permission=“somepermission”)
    4. 检查尝试访问的用户是否具有与AspNetRolePermissions中所需权限配对的角色

    我需要一些帮助,我已经读了一整天了,我找不到任何有用的东西,只是一些我无法应付我需要的东西。

    我认为从这一点来看是最好的方式,因为管理员用户可以创建一个角色,设置该角色的权限,然后将该角色添加到他或她想要的用户数量中。如果我直接将权限设置给用户,那么在将来当我有不止两个用户时,就很难更改权限。


    编辑


    我成功做到了:

    public class ApplicationRole : IdentityRole
    {
        public ApplicationRole()
        {
        }
    
        public ApplicationRole(string name)
            : base(name)
        {
        }
    
        //
    
        public virtual ICollection<UserPermission> Permissions { get; private set; }
    }
    
    public class UserPermission
    {
        public string Id { get; set; } = Guid.NewGuid().ToString();
        public string Permission { get; set; }
        public virtual ICollection<ApplicationRole> Roles { get; private set; }
    
    }
    
    public class UserRolePermissions
    {
        public string RoleId { get; set; }
        public string PermissionId { get; set; }
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        const string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=LocalTestingDB;trusted_connection=yes;";
        public ApplicationDbContext()
            :base(connectionString, throwIfV1Schema: false)
        {
        }
    
        public DbSet<UserPermission> Permissions;
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<UserPermission>()
                .ToTable("AspNetPermissions")
                .HasKey(x => x.Id);
    
            modelBuilder.Entity<ApplicationRole>()
                .HasMany<UserPermission>(ar => ar.Permissions)
                .WithMany(up => up.Roles)
                .Map(arup =>
                    {
                        arup.MapLeftKey("RoleId");
                        arup.MapRightKey("PermissionId");
                        arup.ToTable("AspNetRolePermissions");
                    });
        }
    
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
    

    这为多对多关系创建了AspNetPermissions表和AspNetRolePermissions表,并为角色表提供了更大的定制能力(我认为我没有太多使用它,但很高兴知道我有它)。

    在FilterConfig上。cs,在FilterConfig class I下添加:

    public class HasPermissionAttribute : ActionFilterAttribute
    {
        private string _permission;
    
        public HasPermissionAttribute(string permission)
        {
            Permission = permission;
        }
    
        public string Permission
        {
            get
            {
                return _permission;
            }
            private set
            {
                _permission = value;
            }
        }
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (!CheckIfRoleHasPermission(Permission))
            {                
                var url = new UrlHelper(filterContext.RequestContext);
                var loginUrl = url.Content("/Cuenta/Ingresar");
                filterContext.HttpContext.Response.Redirect(loginUrl, true);
            }
            //base.OnActionExecuting(filterContext);
        }
    
        public bool CheckIfRoleHasPermission(string perm)
        {
            return false;
        }
    }
    

    我需要创建一个名为CheckIfRoleHasPermission的方法,该方法可以接受当前用户角色,并检查是否存在与该角色相关的权限。你知道怎么做吗?或者对我已经做过的做任何修正?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Fede Antuña    7 年前

    编辑

    这个项目现在更先进了,我做了一个指南来解释它的功能。欢迎任何评论(我会接受负面评论来改进)

    编辑2

    现在已经过时了。

    推荐文章