Я занимаюсь разработкой сайта с использованием ядра asp.net 2.0 MVC.
Я столкнулся с ситуацией, когда я хотел бы применить разные фильтры авторизации к различным контроллерам на основе некоторой логики. Например, на всех контроллерах, начинающихся с префикса Identity
, будет запускаться один фильтр авторизации, в то время как на всех других контроллерах будет запускаться другой фильтр авторизации.
Я следовал этой статье , показывая, что это можно сделать, добавив реализацию 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
. Я требую этого, потому что некоторые фильтры, которые я хочу добавить, требуют внедрения зависимостей для их создания.
Мой вопрос: как мне этого добиться? Это вообще возможно?