2016-05-10 12 views
1

。 Role2はrole1と同じものにアクセスできますが、role3ではアクセスできません。ASP.NETアイデンティティの役割

私はコントローラーのauthorize属性でそれを行うことができますが、属性内の役割のリストだけではなく、よりエレガントな方法がありますか?

+1

ロールを集約ロールに結合し、そのロールをコントローラで使用することをお勧めします。独自のAutherizationAttributeを作成し、このクラスで独自のカスタムロジックを定義することもできます。 – Igor

+0

@Igorそのカスタム属性は素晴らしいアイデアです!ありがとう:) –

+0

他の提案。ロール(N)がロール(N-1)にアクセスできる場合は、ユーザーに複数のロールを与えます。たとえば、role3のユーザは、role2とrole1に存在することもできます。このようにして、Authorize属性にロールのリストを追加するのではなく、アクセスレベルに等しい1つのロールがあります。 – tmg

答えて

2

認可ポリシーを構成できます。これは、ロールをポリシーにグループ化することを意味します。

ASP.NETコア例:

services.AddAuthorization(options => 
      { 
       options.AddPolicy("Role1", policy => policy.RequireRole("Role1"); 
       options.AddPolicy("Role2", policy => policy.RequireRole("Role1", "Role2"); 
       options.AddPolicy("Role3", policy => policy.RequireRole("Role1", "Role2", "Role3"); 
      }); 

して認証属性を使用して、コントローラであなたのポリシーを使用します。私は、次の方法でそれを解決した

[Authorize(Policy = "Role3")] 
1

AuthorizeRoleAttribute .cs

public class AuthorizeRoleAttribute : AuthorizeAttribute 
{ 
    public AuthorizeRoleAttribute(string role) : base() 
    { 
     var result = Enum.Parse(typeof(RolesEnum), role); 
     int code = result.GetHashCode(); 
     List<string> list = new List<string>(); 
     foreach (var item in Enum.GetValues(typeof(RolesEnum))) 
     { 
      int tmpCode = item.GetHashCode(); 
      if (tmpCode >= code) 
      { 
       list.Add(item.ToString()); 
      } 
     } 
     Roles = string.Join(",", list); 
    } 

} 

役割ENUM:

public enum RolesEnum 
{ 
    User = 100, 
    Supervisor = 200, 
    Administration = 300, 
    Admin = 400 
} 

コントローラー:

[AuthorizationRole(「スーパーバイザー)] //コントローラはautomaticaly役割をすることによってスーパーバイザへのよりまたは同等のアクセス権を持っているものを検索します

いくつかのコードEnum内の数字。

+1

追加の安全性が必要な場合は、その文字列をコンストラクタの列挙型パラメータに変換します。 'AuthorizeRoleAttribute(RolesEnum role):base()'です。次にそれを '[AuthorizationRole(RolesEnum.Supervisor)]'に適用します。今、あなたはスペルミスを心配する必要はありません。 – Igor

関連する問題