2011-08-10 34 views
8

Authorize属性を使用すると、リソースにアクセスできるロールを指定できます。私は、同様ASP.NET Authorize属性と管理者ユーザーロール

[Authorize(Roles="User, Administrator")] 

、このいずれかを指定する必要がある任意のリソースに行くことを許可されている管理者ユーザーを持つことができるが、場合

[Authorize(Roles="User")] 

は、しかし、それAdministratorには許可され、私は何とか言うことができるいくつかの方法がありますどこに行っても、これをAuthorize属性で指定しないでください。

コントローラのコード)のどこかが[Authorize(Roles="User")]の場合は、管理者の役割もそこに行くことができます。

また、私はそれをすべてに設定することができるかもしれません。

アイデア?

更新日:

を現在、私はよりよい解決策が見つからなかったので、私はそこにも"Administrator"を追加する必要があります私が承認して1つの管理コントローラが[Authorize(Role="Administrator")]属性があると私は属性[Authorize(Role="User")]といくつかの他のコントローラではいくつかのアクションを持っています。

+0

私の解決策は何ですか? – LeftyX

答えて

2

これはあなたのために働くと思います。 AuthorizeAttributeを使用して独自のベースコントローラーを作成し、他のコントローラーをベースクラスに継承させます。

[Authorize(Roles="Admin")] 
public class MyFancyController : Controller 
{ 
} 

[Authorize(Roles = "TaxPayer")] 
public class WizardController : MyFancyController 
{ 
... 

私の意見ではこれは怖いです。

いくつのコントローラ/アクションがありますか?後でこのことを忘れて、管理者がアクセスしたくないページがあるとしたらどうでしょう?

コードをデバッグするのが難しくなりますか?

+0

もし私がどこかに管理者のアクセスを望まない場合は、それが良い点だと思います。質問が更新されました – Joper

1

カスタムフィルタを作成し、それを使用してアクションまたはコントローラを装飾することができます。 これは私がかなり多くを使用してきたシンプルな構造です:あなたはhere

2
[Authorize(Roles = "User, Admin")] 
public class PrestamosController : Controller 
{ 
    // controller details 
} 
+0

投稿したコードを説明した方が良いでしょう。 –

0

いくつかの詳細を読むことができます

public class AuthorizationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
      filterContext.Result = new HttpUnauthorizedResult(); 
      return; 
     } 

     var actionName = filterContext.ActionDescriptor.ActionName; 
     var controllerName = filterContext.Controller.GetType().Name; 

     bool isAuthorized =false; 

     // Put your logic here !!!! 

     if (!isAuthorized) { 
      filterContext.Result = new HttpUnauthorizedResult();   
      return; 
     } 
    } 
} 

これは私が何をすべきかです:「管理者」であることを確認し、ユーザーを作りますロールは「ユーザー」ロールにも含まれます。

0

スタティックロールという概念が必要ですランタイムロール。ここでは簡単な例です:

あなたの役割のリストとそのレベル:

  • 役割:管理者|レベル:1
  • 役割:エディタ|レベル:2
  • 役割:ビューア|レベル:3

ユーザーとその静的役割(静的役割は、あなたがユーザーに割り当てられた役割である):

  • ユーザー:ジョン|役割:管理者
  • ユーザー:Sam |役割:編集者
  • ユーザー:Peter |役割:ビューア

静的ロールとロールレベルを使用して実行時ロールを生成すると、より高いレベルのロールを持つユーザーは自動的に下位レベルのロールを取得します。したがって、計算後、これらのユーザーの実行時間ロールは次のようになります。

  • ユーザー:John |役割:管理者、エディタ、ビューア
  • ユーザー:Sam |役割:エディタ、ビューア
  • ユーザー:Peter |役割:ビューア

そして、あなたは、単に[承認(役割=「ビューア」)]を使用することができ、権限(例えばジョン、サム)の高いレベルを持つユーザーもそれにアクセスすることができます。実行時にビューアの役割も持つ必要があるためです。

スタティックロールと実行時ロールを使用する点は、スタティックロールによってロールの割り当てが容易になるということです。ランタイムロールは、リソースの許可をより簡単にします。

関連する問題