1

我正在尝试编写一个属性类,该类可用于我的所有“管理”操作,然后有效地将所有相关操作/身份验证过滤器应用于该操作。例如,我总是应用AuthoriseAttributeand a custom AdminLayoutAttribute,所以我的意图是只拥有一个AdminAttribute以某种方式暗示上述两​​者的东西。这样我就可以在一个方便的地方对整个管理部分进行更改。

但是我不明白我怎么能做到这一点。任何人都可以指出我正确的方向吗?

非常感激。

4

1 回答 1

3

您可以考虑将它们从操作移动到控制器类或管理操作的基本控制器类。这样,您只需在控制器类中设置AuthorizeAdminLayout属性,而不是每个单独的操作方法。

[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添加一个AdminAttribute将其与AuthorizeAttribute

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);
    }

}

这两个选项的关键是不让新的 AdminAttribute 类继承自 2 个具体类,因为 C# 不支持多重继承。

于 2012-12-12T21:50:31.083 回答