我正在尝试制作一个权限/角色授权应用程序。我的想法是混合角色和权限,以便管理员可以创建具有不同权限的不同角色来做一些事情。
实例
我想把这样的东西放在我的控制器中:
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
最后,我将为一些用户添加角色(这一部分我已经完成了)。
我不能做到的是:
-
创建AspNetPermissions和AspNetRolePermissions
-
创建AspNetRolePermissions与AspNetPermissions和AspNetRoles之间的关系
-
创建过滤器HasPermission(Permission=“somepermission”)
-
检查尝试访问的用户是否具有与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的方法,该方法可以接受当前用户角色,并检查是否存在与该角色相关的权限。你知道怎么做吗?或者对我已经做过的做任何修正?