C# ASP.NET Identity 2 (.NET Framework MVC) - 使用权限和角色
C# ASP.NET Identity 2 (.NET Framework MVC) - Using permission AND roles
我正在尝试制作一个 permission/role 授权应用程序。我的想法是混合角色和权限,以便管理员可以创建具有不同权限的不同角色来执行某些操作。
示例,
我想在我的控制器中加入这样的东西:
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()
}
}
}
我的想法是在最初的五个 "come" 和 ASP.NET 标识的基础上创建两个额外的 table,一个称为 AspNetPermissions,另一个称为 AspNetRolePermissions
AspNetPermissions 将具有 Id 和 Permission 字段。 AspNetRolePermissions 将具有 RoleId 和 PermissionId。
管理员用户可以创建、编辑或删除角色。角色将成为对权限进行分组的友好方式。因此,例如,我想允许维护角色下的所有用户使用我以前的控制器和营销角色下的用户的 "SensitiveData" 和 "ListUsers" 操作,只允许使用 "ListUsers"行动。我将从管理员帐户创建角色 "Maintenance",将设置权限添加到 "SensitiveData" 和 "ListUsers"。然后我将遵循相同的概念来创建角色 "Marketing",因此 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 table 和 AspNetRolePermissions table 并为我提供了对角色 table 的更多自定义能力(不经常使用它,但很高兴知道我拥有它,我想)。
在 FilterConfig.cs 上,在 FilterConfig class 下我添加了:
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我的代码。这是 link:REPO-NO-LONGER-AVAILABLE。有一些西班牙语的部分,但我会尝试做一个指南来解释我的代码的核心部分在哪里,这样它就可以添加到任何项目中,稍后我也会尝试将所有内容分离到一个不同的项目中,然后上传代码到 NuGet。欢迎任何想要增加功能或与 repo 合作的人!
编辑
该项目现在更高级了,我制作了一份指南来解释它的作用。欢迎任何评论(我会接受负面的改进)
编辑 2
现在已经过时了。
我正在尝试制作一个 permission/role 授权应用程序。我的想法是混合角色和权限,以便管理员可以创建具有不同权限的不同角色来执行某些操作。
示例,
我想在我的控制器中加入这样的东西:
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()
}
}
}
我的想法是在最初的五个 "come" 和 ASP.NET 标识的基础上创建两个额外的 table,一个称为 AspNetPermissions,另一个称为 AspNetRolePermissions
AspNetPermissions 将具有 Id 和 Permission 字段。 AspNetRolePermissions 将具有 RoleId 和 PermissionId。
管理员用户可以创建、编辑或删除角色。角色将成为对权限进行分组的友好方式。因此,例如,我想允许维护角色下的所有用户使用我以前的控制器和营销角色下的用户的 "SensitiveData" 和 "ListUsers" 操作,只允许使用 "ListUsers"行动。我将从管理员帐户创建角色 "Maintenance",将设置权限添加到 "SensitiveData" 和 "ListUsers"。然后我将遵循相同的概念来创建角色 "Marketing",因此 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 table 和 AspNetRolePermissions table 并为我提供了对角色 table 的更多自定义能力(不经常使用它,但很高兴知道我拥有它,我想)。
在 FilterConfig.cs 上,在 FilterConfig class 下我添加了:
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我的代码。这是 link:REPO-NO-LONGER-AVAILABLE。有一些西班牙语的部分,但我会尝试做一个指南来解释我的代码的核心部分在哪里,这样它就可以添加到任何项目中,稍后我也会尝试将所有内容分离到一个不同的项目中,然后上传代码到 NuGet。欢迎任何想要增加功能或与 repo 合作的人!
编辑
该项目现在更高级了,我制作了一份指南来解释它的作用。欢迎任何评论(我会接受负面的改进)
编辑 2
现在已经过时了。