7

我只是想知道 AuthorizeAttribute 的生命周期,并开始调试 AuthorizeAttribute 的默认构造函数,但没有得到任何命中。

这是自定义授权过滤器的代码。

 public class CustomAuthorizeAttribute :  AuthorizeAttribute
 {
    public CustomAuthorizeAttribute() : base()
    {
        string test = string.Empty;
    }
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        //Some code
    }
}

请任何人帮助我了解此 AuthorizeAttribute 的生命周期?

谢谢

4

1 回答 1

8

这很难回答,因为AuthorizeAttribute是 anAttribute和 an IAuthorizationFilter

在 的上下文中Attribute,它在 MVC 框架第一次调用 GetAttributes() 时加载。属性是元数据,因此如果在附加调试器之前加载它就不足为奇了。

在 的上下文中IAuthorizationFilter,它取决于过滤器的注册方式。如果注册为全局过滤器:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomAuthorizeAttribute());
        filters.Add(new HandleErrorAttribute());
    }
}

然后它显然在 MVC 应用程序启动期间被实例化,在这种情况下,过滤器集合是静态的,因此每次启动仅实例化一次。

如果过滤器作为属性放置在控制器或操作方法上,那么事情就会变得更加混乱。运行动作时,MVC 框架使用 加载与该动作方法相关的任何属性FilterAttributeFilterProvider并执行它们。在这种情况下,有一个实例被加载为 a IAuthorizationFilter,它扫描同一类的另一个实例,即Attribute.

如果您需要显式控制过滤器的生命周期,那么您可以构建自己IFilterProvider的过滤器来做到这一点。

但是没有办法控制属性的生命周期。您应该假设它始终作为单例加载,并且无法创建或销毁它。

AuthorizeAttribute(作为过滤器)的默认行为扫描(作为属性)的另一个实例AuthorizeAttribute以便读取它包含的用户/组元数据。过滤器完成了繁重的工作,属性只是一个标记。如果这太令人困惑,您可以根据Passive Attributes将它们分成 2 个单独的类。

于 2018-01-08T19:57:28.933 回答