0

我試圖做一個權限/角色授權的應用程序。我的想法是混合角色和權限,以便管理員可以創建具有不同權限的不同角色來執行某些操作。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 

我將這些角色添加到一些用戶(我有它的那部分工作)。

我無法實現的是:

  1. 創建AspNetPermissions和AspNetRolePermissions
  2. 創建AspNetPermissions和AspNetRoles
  3. 創建過濾器調用hasPermission(權限= 「somepermission」)AspNetRolePermissions之間的關係
  4. 檢查試圖訪問的用戶是否具有與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的任何許可。任何想法如何做到這一點?或者對我已經完成的任何更正?

+0

這是什麼問題? –

+0

「我無法達到的目標是:」部分,那4個部分 –

+0

現在還不清楚你到底需要什麼幫助,而且任何人都不可能幫助你。告訴我們你試圖達到你想要的和你得到的錯誤。請閱讀[https://stackoverflow.com/help/mcve](https://stackoverflow.com/help/mcve) – Hintham

回答

0

我做到了,如果有人處於相同的情況,我只是上傳到GitHub我的代碼。以下是鏈接:https://github.com/fedeantuna/Anatis.ExtendedIdentity。有一些西班牙語的部分,但我會嘗試做一個指導,說明我的代碼的核心部分在哪裏,以便它可以添加到任何項目中,稍後我還會嘗試將所有內容分離到不同的項目中,然後上傳代碼到NuGet。任何想要增加功能或與回購協作的人都歡迎!

編輯

該項目現在的方式更先進,我做了一個指南解釋它做什麼。任何評論歡迎(我會採取負面的改善它)