我正在尝试制作权限/角色授权应用。我的想法是混合角色和权限,以便管理员可以创建具有不同权限的不同角色来执行某些操作。
实施例,
我想在我的控制器中添加这样的东西:
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身份,一个名为AspNetPermissions,另一个名为AspNetRolePermissions
AspNetPermissions将具有Id和Permission字段。 AspNetRolePermissions将具有RoleId和PermissionId。
管理员用户可以创建,编辑或删除角色。角色将成为分组权限的友好方式。因此,例如,我想允许维护角色下的所有用户允许使用我以前的控制器中的“SensitiveData”和“ListUsers”操作以及Marketing角色下的用户允许仅使用“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表的自定义功能(不是那么多,但我很高兴知道我拥有它,我认为)。 / p>
在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的方法,该方法可以获取当前用户角色并检查是否有与该角色相关的任何权限。有关如何做到这一点的任何想法?或者对我已经完成的任何更正?
答案 0 :(得分:0)
我做到了,如果有人处于相同的情况,我只是将我的代码上传到GitHub。这是链接:REPO-NO-LONGER-AVAILABLE。西班牙语中有一些部分,但我会尝试制作一个指南,说明我的代码的核心部分在哪里,以便它可以添加到任何项目中,之后我也会尝试将所有内容分成不同的项目然后将代码上传到NuGet。任何想要增加功能或与回购协作的人都欢迎!
修改强>
该项目现在更加先进,我做了一个指南,解释它的作用。欢迎任何评论(我会采取消极的评论来改进它)
编辑2
现在已经过时了。