我正在使用asp.net core 2.0 MVC开发网站。
我遇到了一种情况,我想基于某种逻辑将不同的授权过滤器应用于不同的控制器。例如,所有以前缀Identity开头的控制器将运行一个授权过滤器,而所有其他控制器将运行另一个授权过滤器。

我跟随this article展示了可以通过在IControllerModelConvention方法中启动时在services.addMvc(options)方法中添加ConfigureServices实现来完成此操作,如下所示。

services.AddMvc(options =>
{
    options.Conventions.Add(new MyAuthorizeFiltersControllerConvention());
    options.Filters.Add(typeof(MyOtherFilterThatShouldBeAppliedGlobally));
}


这是类MyAuthorizeFiltersControllerConvention,您可以在其中看到我正在基于命名约定向每个控制器添加特定的授权过滤器。

public class AddAuthorizeFiltersControllerConvention : IControllerModelConvention
{
    public void Apply(ControllerModel controller)
    {
        if (controller.ControllerName.StartsWith("Identity"))
        {
            controller.Filters.Add(new AuthorizeFilter(...));

            // This doesn't work because controller.Filters
            // is an IList<IFilterMetadata> rather than a FilterCollection
            controller.Filters.Add(typeof(AnotherFilter));
        }
        else
        {
            controller.Filters.Add(new AuthorizeFilter(...));
        }
    }
}


我遇到的问题是我无法像在启动typeof(filter)方法期间那样使用ConfigureServices重载以这种方式添加过滤器。我需要这样做是因为我要添加的某些过滤器需要依赖注入才能实例化它们。

我的问题是我该如何实现?可能吗

最佳答案

这是您可以执行的操作:

controller.Filters.Add(new TypeFilterAttribute(typeof(AnotherFilter)));

10-05 19:23