我正在使用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)));