2017-06-30 23 views
1

私はIdentity 2.0 FrameworkでASP.NET MVCアプリケーションを構築しています。 SQL ServerのAspNet*テーブルにユーザーとロールを追加しました。ここでの役割のサンプルです:SystemAdminASP.NET ID 2の階層的な役割

  • 金融
  • 一般
  • SquadLeader
  • 管理
  • SystemAdminシステム

誰かが他のすべての役割を担っています。 Managementは、SquadLeaderおよびFinanceを含む。

これらをAspNetUserRolesに割り当てると、各ユーザーのすべての組み合わせをリストするのは嫌です。 1つのロールをロールのグループまたは階層にする方法はありますか?だからを実行すると、SystemAdminという役割が割り当てられているユーザーにとっては本当ですか?ありがとう。

+2

組み込みのクラスでは、いいえ、方法はありません。あなたは独自の実装を作成する必要があります –

+0

ありがとう、@CamiloTerevinto。私はそれを恐れていた – Alex

+2

残念ながら、組み込みのクラスは非常に限られています。私は自分のStore/User/Roleの実装を書いている時代のほとんどを自分で見つけました。 –

答えて

2

これらの役割を「そのまま」とし、ここでの役割のリストがすべてそれらのものであると仮定すると、これをフラグベースの列挙型に変換し、役割の集合の表現を整数としてdbに格納できます。ここで

は、あなたが「RoleFlags」を持つことができ、これを使用して...私のビジネスロジックにこれを適用するとき、私のようなものを言うことができ

public enum Role 
{ 
    Finance = 1 
    General = 2 
    SquadLeader = 4 
    Management = 8 
    SystemAdmin = 16 
} 

...それがうまくいくかもしれない方法です

var genAndSysAdmin = 18; 
var genAndSysAdminFlags = Role.General || SystemAdmin; 

ユーザーオブジェクトのタイプ「役割」の変数と

User.Roles.HasFlag(Role.Management) 

...のようなチェックがない...ユーザーがGIVであるかどうかをチェックしますenロール。あなたの例では言い換えれば 彼らは、フラグ値が...

var allRoles = 16 + 8 + 4 + 2 + 1; 

だろうシステム管理者を持っている場合、ユーザは他のすべての役割を持っている場合...基本的にこれは単純なビットマップのように動作します。

どのように!

このようにセキュリティモデルを設計することはお勧めできません。

代わりに、通常のロール構造を作成する必要がありますが、ロールには子ロールのコレクションと親ロールを持たせる必要があります。これは、LDAP/Active Directoryの種類の設定のようなものを作品より典型的な設計を可能にする

...

public class Role 
{ 
    [Key] 
    public Guid Id { get; set; } 
    [ForeignKey("Parent")] 
    public Guid ParentId { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public virtual Role Parent { get; set; } 
    public ICollection<User> Users { get; set; } 
    public ICollection<Role> Children { get; set; } 
} 

public class User 
{ 
    [Key] 
    public Guid Id { get; set; } 
    ... 
    public ICollection<Role> Roles { get; set; } 
} 

このように、我々のセットアップ我々のデータを...

new Role { Id = 1, Name = "SystemAdmin" } 
new Role { Id = 2, Name = "Management", ParentId = 1 } 
new Role { Id = 3, Name = "SquadLeader", ParentId = 2 } 
... 

。 ..この方法で作業することで、任意の親ロール内のすべての子ロールの権限のレベルを柔軟に継承できます。また、より典型的なパターンを採用しながら、シミュレートしようとしている階層のようなアクセス権を扱うことができます。将来、新しい役割を追加する。

+0

ありがとう、偉大な答えのための@ワー。 2つのクラスの書式を編集するのに気にしないでください。フォローアップ:これらの役割をSQL Server上のアイデンティティ・フレームワークの「AspNetRoles」テーブルにどのように関連付けるのですか?自分のIDのロールに独自のGUIDを割り当てますか? – Alex

+0

私はアレックスの2番目の質問です。 – Sinjai

+0

ネクタイ?あなたのコードでは、通常は名前でロールを参照することをお勧めします。そのため、id値は単なる実装の詳細ですが、重要なのはiuserとiroleの独自のバージョンをフレームワークに実装できる場合です。その機能のサブセットをあなた自身のものに置き換えるために実装したいインターフェイスです。 – War

関連する問題