2009-09-04 18 views
6

AUTHORIZEフィルタを使用すると、コントローラやアクションにアクセスできるユーザーの指定したグループにできます:私ではなく、それが可能かどうかを知りたいASP.NET MVC:[承認]の反対

[Authorize(Roles="Administrator")] 
public class HomeController : Controller 
{ 
    // code 
} 

がコントローラーまたはアクションにアクセスできないユーザーグループを指定します。

+1

を私は切り替えシナリオを想像することはできませんホワイトリストの実装からブラックリストの実装までは意味をなさないでしょう。 –

+0

私は管理者が顧客関連のコントローラにアクセスするのを望んでいませんが、私は明らかに許可されていないユーザーと顧客ができることが必要です。 – ajbeaven

+0

多くの場合、意味があり、ほとんどの認証システムには拒否のサポートが含まれています。すべてのユーザーが特定の役割のメンバー以外の何かを行う権限を持っているシナリオを考えてみましょう。 – ShadowChaser

答えて

5

を見つけることができますそれは正しい練習ですが、それは仕事をします。

+0

は私によく見えます! :) – jeef3

+0

Restrict属性は一度に複数のロールを受け入れますか? – twk

+0

+1すてきな簡単な解決策 – CmdrTallen

1

このような機能を実装できる独自のActionFilterを用意する必要があります。 デフォルトでは、すべてを拒否するルールがありますが、(既に知っているように)Authorizeアクションフィルタで定義できます。私はどうかわからないんだ

[Restrict("Administrator")] 
public class HomeController : Controller 
{ 
    // code 
} 

public class Restrict : AuthorizeAttribute 
{ 
    private readonly string _role; 

    public Restrict(string role) 
    { 
     _role = role; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     if (httpContext.User.IsInRole(_role)) 
      return false; 

     return true; 
    } 
} 

そして、私はこのようにそれを使用します。

いくつかのインスピレーションは、私がTWKの提案の後に自分のAuthorizationAttributeを作成しようとしたthere

1

ajbeaven's answerに基づいて、私は1つの役割の代わりに役割のリストにそれを拡張することができました。

まずクラスを制限:

public class Restrict : AuthorizeAttribute { 
    private List<string> _roles; 
    public string Roles { 
     get { 
      string roles = ""; 
      if (_roles != null && _roles.Count > 0) { 
       int counter = 0; 
       foreach (string role in _roles) { 
        counter++; 
        if (counter == _roles.Count) { 
         roles = role; 
        } else { 
         roles += role + ","; 
        } 
       } 
      } 
      return roles; 
     } 
     set { 
      _roles = new List<string>(); 
      string[] roles = value.Split(','); 
      foreach (string role in roles) { 
       _roles.Add(role); 
      } 
     } 
    } 

    public Restrict() { 
     _roles = new List<string>(); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) { 
     bool result = true; 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 
     foreach (string role in _roles) { 
      if (httpContext.User.IsInRole(role)) { 
       result = false; 
       break; 
      } 
     } 
     return result; 
    } 
} 

そして、ソリューション全体を再利用可能にするためにAppRolesクラスを追加します。

public static class AppRoles { 
    public const string Role1 = "Role1"; 
    public const string Role2 = "Role2"; 
} 

使用法:

[Authorize] 
[Restrict(Roles = AppRoles.Role1 + "," + AppRoles.Role2)] 
    public ActionResult Index() { 
    return View(); 
} 
関連する問題