我試圖做一個權限/角色授權的應用程序。我的想法是混合角色和權限,以便管理員可以創建具有不同權限的不同角色來執行某些操作。C#ASP.NET身份2(.NET框架MVC) - 使用權限和角色
例,
我想提出這樣的事情在我CONTROLER:
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和權限字段。 AspNetRolePermissions將具有RoleId和PermissionId。
管理員用戶可以創建,編輯或刪除角色。角色將成爲分組權限的友好方式。因此,舉例來說,我想允許根據維修角色的所有用戶將被允許使用「SensitiveData」和「ListUsers」行動,從我以前的控制器和用戶下的營銷作用,被允許使用只有「ListUsers」行動。我將從管理員帳戶創建角色「維護」,將設置權限添加到「敏感數據」和「ListUsers」。然後,我將遵循同樣的理念,創建角色「市場營銷」,所以去的DB會看起來像:
-------------------------------
AspNetPermissions*
-------------------------------
Id | Permission
---------------|---------------
permissionId1 | SensitiveData
permissionId2 | ListUsers
... | ...
*這一個是預裝,甚至沒有管理員終於可以創建權限
-------------------------------
AspNetRolePermissions
-------------------------------
RoleId | PermissionId
---------------|---------------
maintenanceId | permissionId1
maintenanceId | permissionId2
marketingId | permissionId2
我將這些角色添加到一些用戶(我有它的那部分工作)。
我無法實現的是:
- 創建AspNetPermissions和AspNetRolePermissions
- 創建AspNetPermissions和AspNetRoles
- 創建過濾器調用hasPermission(權限= 「somepermission」)AspNetRolePermissions之間的關係
- 檢查試圖訪問的用戶是否具有與AspNetRolePermissions中的所需權限配對的角色
我需要一些幫助,我一直在讀了整整一天,我無法找到任何有用的,只是一對夫婦的事情,我不能大潮我需要什麼。
我認爲,從這個角度看,這是最好的方式,因爲管理員用戶可以創建一個角色,設置該角色的權限,然後添加角色的howmany用戶他或她想要。如果我將權限直接設置給用戶,那麼在將來有更多用戶時,很難更改權限。
編輯
我已經成功地做到這一點:
在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();
}
}
,與AspNetRolePermissions表的多對多關係沿着創建AspNetPermissions表,並讓我在角色表更多的定製電源(未使用它,但很高興知道我擁有它,我認爲)。
在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方法,可以把當前的用戶角色,檢查是否有與該角色asociated的任何許可。任何想法如何做到這一點?或者對我已經完成的任何更正?
這是什麼問題? –
「我無法達到的目標是:」部分,那4個部分 –
現在還不清楚你到底需要什麼幫助,而且任何人都不可能幫助你。告訴我們你試圖達到你想要的和你得到的錯誤。請閱讀[https://stackoverflow.com/help/mcve](https://stackoverflow.com/help/mcve) – Hintham