2013-06-24 12 views
16

クラスメソッドで2つの別個の認可属性を指定する際に問題があります.2つの属性のいずれかがtrueの場合、ユーザーはアクセスを許可されます。メソッドの複数の承認属性

ザ・Athorizationクラスは、次のようになります。

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)] 
public class AuthAttribute : AuthorizeAttribute { 
. . . 

とアクション:

[Auth(Roles = AuthRole.SuperAdministrator)] 
[Auth(Roles = AuthRole.Administrator, Module = ModuleID.SomeModule)] 
public ActionResult Index() { 
    return View(GetIndexViewModel()); 
} 

は、これを解決する方法はありますか私は私のアプローチを再考する必要がありますか?

これはMVC2で実行されます。

答えて

21

複数のAuthorizeAttributeインスタンスは、MVCによって、ANDと結合されているかのように処理されます。 ORの動作が必要な場合は、チェック用に独自のロジックを実装する必要があります。好ましくはAuthAttributeを実装して複数の役割を果たし、ORロジックで独自のチェックを実行します。

標準のAuthorizeAttributeを使用し、bool IsInRole(string role)メソッドを実装して「OR」動作を実装するカスタムIPrincipalを実装することです。

はここにある: https://stackoverflow.com/a/10754108/449906

+0

でこれに関する詳細情報を見つけることができます

[Authorize(Roles = "PowerUser")] [Authorize(Roles = "ControlPanelUser")] 

[Authorize(Roles = "PowerUser,ControlPanelUser")] 

および実施例(すなわち 'いくつかの 'AuthAttributes'を入力として受け取るpublicクラスMultipleAuthOrAttribute {')? – adamse

+2

他のアトリビュートのインスタンスをとるアトリビュートを作成することはできません。属性クラスコンストラクタは、コンパイル時に有効な値/プリミティブ型のみを受け入れることができます。だから、 'AuthorizeAttribute'はRolesを文字列として扱うのです。 –

+1

複数の 'AuthorizeAttribute'インスタンスが論理' AND'として処理されるという文をサポートする公式文書への参照を提供することはできますか?私自身のテストでは、フィルタの順番が重要であると思われます。最初のフィルタでは、認証が成功するかどうかの最終的な結果が得られます。 –

19

あなたはORとAND役割の両方を行うことができますasp.netのそれ以降のバージョンでこれを行うには良い方法があります。これは慣例により行われ、1つのAuthorize内の複数のロールを列挙するとORを実行し、複数のAuthorize Attributesを追加するとANDを実行します。

ORたとえばあなたが、別の許可属性を作成することは可能であろう次のリンク https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles