【发布时间】:2018-03-29 14:34:15
【问题描述】:
我正在尝试制作权限/角色授权应用。我的想法是混合角色和权限,以便管理员可以创建具有不同权限的不同角色来执行某些操作。
例子,
我想在我的控制器中加入这样的东西:
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。
管理员用户可以创建、编辑或删除角色。这些角色将成为对权限进行分组的友好方式。因此,例如,我希望允许维护角色下的所有用户使用我以前的控制器的“SensitiveData”和“ListUsers”操作,而营销角色下的用户只允许使用“ListUsers”操作。我将从管理员帐户创建角色“维护”,将设置权限添加到“敏感数据”和“列表用户”。然后我会按照相同的概念来创建“营销”角色,所以 de DB 看起来像:
-------------------------------
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 中所需权限配对的角色
我需要一些帮助,我已经阅读了一整天,但找不到任何有用的东西,只是一些我无法满足我需要的东西。
我认为从这一点来看是最好的方法,因为管理员用户可以创建一个角色,设置该角色的权限,然后将该角色添加到他或她想要的多少用户。如果我将权限直接设置给用户,那么当我拥有的用户不止几个时,以后就很难更改权限。
编辑
我已经做到了:
在 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 的方法,它可以获取当前用户角色并检查是否有任何与该角色相关的权限。关于如何做到这一点的任何想法?或者对我已经完成的事情进行任何更正?
【问题讨论】:
-
问题是什么?
-
“我无法实现的是:”部分,这 4 个项目
-
目前尚不清楚您究竟需要什么帮助,而且不太可能有人能够帮助您。告诉我们您为实现您想要的目标所做的努力以及您遇到的错误。请阅读https://stackoverflow.com/help/mcve
-
对不起,我已经把它弄红了,我认为我说得非常清楚。我没有尝试过的东西,因为我已经丢失了更改(无论如何我尝试过的东西都无处可去),并且我准确地解释了我正在尝试做的事情并需要帮助。根据我建议的模式。我今天会尝试阅读并再次执行此操作,但我不知道如何更清楚
-
这不是一个不合理的设计,但我认为您的问题范围有点大。我建议将您的问题分解为多个问题并尝试找到这些答案。
标签: asp.net-mvc permissions asp.net-identity .net-framework-version asp.net-roles