我正在尝试制作权限/角色授权应用程序。我的想法是混合角色和权限,以便管理员可以创建具有不同网络权限的不同角色来做一些事情。
例子,
我想在我的控制器中放入这样的东西:
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()
}
}
}
我的想法是为 ASP.NET Identity“附带”的前五个表创建两个额外的表,一个称为 AspNetPermissions,另一个称为 AspNetRolePermissions
AspNetPermissions 将具有 Id 和 Permission 字段。AspNetRolePermissions 将具有 RoleId 和 PermissionId。
Admin 用户可以创建、编辑或删除角色。角色将成为对权限进行分组的友好方式。因此,例如,我希望允许维护角色下的所有用户使用我以前的控制器中的“SensitiveData”和“ListUsers”操作,而营销角色下的用户只允许使用“ListUsers”操作。我将从管理员帐户创建角色“维护”,将设置权限添加到“SensitiveData”和“ListUsers”。然后我会遵循相同的概念来创建角色“营销”,所以 de DBs 看起来像:
-------------------------------
AspNetPermissions*
-------------------------------
Id | Permission
---------------|---------------
permissionId1 | SensitiveData
permissionId2 | ListUsers
... | ...
*这个是预加载的,连管理员都不能创建权限
-------------------------------
AspNetRolePermissions
-------------------------------
RoleId | PermissionId
---------------|---------------
maintenanceId | permissionId1
maintenanceId | permissionId2
marketingId | permissionId2
最后,我会将角色添加到一些用户(我让它工作的那部分)。
我无法实现的是:
我需要一些帮助,我已经阅读了一整天,但找不到任何有用的东西,只有一些我无法满足我需要的东西。
我认为从这一点来看这是最好的方法,因为管理员用户可以创建一个角色,为该角色设置权限,然后将该角色添加到他或她想要的用户数量。如果我直接为用户设置权限,那么当我拥有的不仅仅是几个用户时,以后更难更改权限。
编辑
我设法做到了这一点:
在 IdentityModel.cs 上,我以这种方式添加了 ApplicationRole 和 UserPermission 并编辑了 ApplicationDbContext:
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 表,并为我提供了对 Roles 表的更多自定义功能(我认为没有那么多使用它,但知道我拥有它很高兴)。
在 FilterConfig.cs 上,在我添加的 FilterConfig 类下:
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 的方法,该方法可以采用当前用户角色并检查是否有与该角色相关联的任何权限。关于如何做到这一点的任何想法?或者对我已经做过的事情有什么更正?
我做到了,如果有人遇到同样的情况,我只是将我的代码上传到 GitHub。这是链接:回购不再可用。有一些部分是西班牙语的,但我会尝试制作一个指南,解释我的代码的核心部分在哪里,以便它可以添加到任何项目中,稍后我也会尝试将所有内容分成不同的项目,然后上传代码到 NuGet。欢迎任何想要增加功能或与 repo 合作的人!
编辑
该项目现在更先进了,我制作了一个指南来解释它的作用。欢迎任何评论(我会接受负面评论以改进它)
编辑 2
现在已经过时了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句