1

すべての「管理者」アクションで使用できる属性クラスを作成しようとしています。これにより、関連するすべてのアクション/認証フィルターがそのアクションに効果的に適用されます。たとえば、私は常に theAuthoriseAttributeと a customを適用するので、上記の両方を何らかの形で意味するAdminLayoutAttributean を持つことを意図しています。AdminAttributeそうすれば、1 つの便利な場所で管理セクション全体に変更を加えることができます。

ただし、これを行う方法がわかりません。誰でも私を正しい方向に向けることができますか?

とても有難い。

4

1 に答える 1

3

それらをアクションからコントローラー クラスまたは管理者アクションの基本コントローラー クラスに移動することを検討できます。そうすれば、個々のアクション メソッドではなく、コントローラ クラスでAuthorizeと属性の両方を設定するだけです。AdminLayout

[Authorize]
[AdminLayout]
public AdminController: Controller
{
    //action methods
}

承認といくつかのカスタム レイアウト ロジックを組み合わせた属性を持つことは、単一責任の原則の破綻と見なされる可能性がありますが、他に選択肢がない場合は、次のアプローチを試すことができます。

AdminLayoutAttribute既存のものを新しいに置き換えたい場合AdminAttributeは、 を作成しAdminAttributeて標準から継承しAuthorizeAttribute、カスタム AdminLayoutAttribute のように IActionFilter\IResultFilter を実装することもできます。

public class AdminLayoutAttribute: AuthorizeAttribute, IActionFilter, IResultFilter
{
    //Logic as in existing AdminLayoutAttribute to be replaced
}

それ以外の場合は、既存のものを保持し、それを と組み合わせAdminLayoutAttributeた新しいものを追加する場合は、カスタム属性から継承し、タイプ AuthorizationFilter の内部インスタンスを呼び出して IAuthorizationFilter を実装できます。AdminAttributeAuthorizeAttribute

public class AdminLayoutAttribute: AdminLayoutAttribute, IAuthorizationFilter
{
    //Implement IAuthorizationFilter by delegating to an internal AuthorizeFilter instance
    private _authorizeFilter = new AuthorizeAttribute();

    public override object TypeId 
    { 
        //override from base Attribute class as in AuthorizeAttribute class
        get { return _authorizeFilter.TypeId ; }
    }

    public string Roles 
    {
        get { return _authorizeFilter.Roles; }
        set { _authorizeFilter.Roles = value; }
    }

    public string Users 
    {
        get { return _authorizeFilter.Users; }
        set { _authorizeFilter.Users = value; }
    }

    public void OnAuthorization(AuthorizationContext filterContext) 
    {
        _authorizeFilter.OnAuthorization(filterContext);
    }

}

両方のオプションで重要なのは、C# では多重継承がサポートされていないため、新しい AdminAttribute クラスが 2 つの具象クラスから継承されないようにすることです。

于 2012-12-12T21:50:31.083 に答える