0

私はパーミッション/ロール認可アプリケーションを作成しようとしています。私の考えは、役割と権限を混在させて、管理者が異なる権限を持つ異なる役割をいくつか作成することができるようにすることです。C#ASP.NET ID 2(.NET Framework 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のアイデンティティと「来る」という最初の5に2つの余分なテーブルを作成することでしたAspNetPermissionsと呼ばれるものとAspNetRolePermissionsと呼ばれるものがあります。

AspNetPermissionsにはIdとPermissionのフィールドがあります。 AspNetRolePermissionsにはRoleIdとPermissionIdがあります。

管理ユーザーは、役割を作成、編集、または削除できます。役割は、アクセス許可をグループ化するための単なるフレンドリな方法になります。たとえば、メンテナンスの役割を持つすべてのユーザーが、以前のコントローラーの「SensitiveData」および「ListUsers」アクションを使用できるようにし、マーケティング・ロールのユーザーが「ListUsers」アクションのみを使用できるようにしたいとします。私は管理者アカウントから "メンテナンス"ロールを "SensitiveData"と "ListUsers"に設定された権限を追加して作成します。 *

------------------------------- 
     AspNetPermissions* 
------------------------------- 
Id    | Permission 
---------------|--------------- 
permissionId1 | SensitiveData 
permissionId2 | ListUsers 
...   | ... 

この1がプリロードされ、さえない管理者が権限最後に

------------------------------- 
     AspNetRolePermissions 
------------------------------- 
RoleId   | PermissionId 
---------------|--------------- 
maintenanceId | permissionId1 
maintenanceId | permissionId2 
marketingId | permissionId2 

を作成することができます。そして、私は、DBのは次のようになりますデので、役割「マーケティング」を作成するために、同じ概念をたどります私は一部のユーザー(私はそれが働いている部分)に役割を追加します。私は達成できない何

さ:

  1. AspNetPermissionsとAspNetRolePermissionsとの関係を作成しAspNetPermissionsとAspNetRolePermissions
  2. を作成し、AspNetRoles
  3. フィルターHasPermission(許可は= "somepermission")を作成します。
  4. アクセスしようとするユーザーが、AspNetRolePermissionsで必要なアクセス許可とペアになっている役割を持っているかどうかを確認します。

私は一日中読んでいましたが、役立つものは何も見つかりませんでした。私が必要としているものではうまくいきません。

管理者ユーザーが役割を作成し、その役割のアクセス許可を設定してから、その役割をどのようなユーザーに追加するかは、この時点から見れば最善の方法だと思います。ユーザーに直接アクセス許可を設定すると、複数のユーザーしかいない場合にアクセス許可を今後変更することが難しくなります。


私はこれを行うことができた


EDIT:IdentityModelオン

。CS私はApplicationRoleとUserPermission追加され、このようにApplicationDbContextを編集した:多くの関係に多くのためのAspNetRolePermissionsテーブルと一緒にAspNetPermissionsテーブルを作成し、私の役割テーブルをより細かくカスタマイズパワー(ないを与える

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(); 
    } 
} 

私はそれを持っていることを知っていることはよく分かります)。 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; 
    } 
} 

を私は現在のユーザーの役割を取るし、その役割とasociated任意の権限があるかどうかを確認することができますCheckIfRoleHasPermissionというメソッドを作成する必要があります。どのようにそれを行う上の任意のアイデアですか?私がすでにやったことの修正?

+0

何が質問ですか? –

+0

「私が達成できないもの」とは、それらの4つの要素のことです。 –

+0

正確に何が助けを必要としているのかは不明です。誰でもあなたを助けることはできません。あなたが望むものを達成しようとしたこと、そしてどんなエラーが出ているのか教えてください。 [https://stackoverflow.com/help/mcve](https://stackoverflow.com/help/mcve) – Hintham

答えて

0

誰かが同じ状況にいる場合、私はちょうど私のコードをGitHubにアップロードしました。リンクはhttps://github.com/fedeantuna/Anatis.ExtendedIdentityです。いくつかのパーツがスペイン語で書かれていますが、私はコードの中核部分がどこにあるのかを説明するガイドを作成して、どのプロジェクトにも追加できるようにして、後ですべてを別のプロジェクトに分けてアップロードします。 NuGetへのコード。機能性を高めたり、リポジトリとコラボレーションしたい人は歓迎します。

EDIT

プロジェクトは、私はそれが何をするかを説明するガイドを作った、今の方法より高度です。どのレビューも歓迎されています(改善のために否定的なものを取ります)

関連する問題