У меня есть пользовательский поставщик членства / ролей, который я использую в своих контроллерах MVC, и я также хочу, чтобы он был доступен для ASP.NET MVC, чтобы я мог использовать AuthorizationFilters и т. Д. Так как очень много людей внедрили пользовательских поставщиков, я представляю, люди сделали это, но я не понял этого и не нашел сообщений, которые конкретно касаются этой проблемы. Этот пост является обратной стороной моего вопроса. В моем случае мой пользовательский провайдер хорошо работает с моими контроллерами, и я хочу, чтобы MVC тоже использовал его.
Мой провайдер реализован с использованием схемы ввода-вывода IoC / зависимостей. Поставщик предоставляет дополнительные функциональные возможности помимо базового API членства / ролей. В моих контроллерах я использую Castle Windsor для создания экземпляров. Код выглядит примерно так:
public class HomeController : Controller {
IMembershipService _membershipService;
public HomeController(IMembershipService membershipService) {
_membershipService= membershipService;
}
}
<castle>
<components>
<component id="MembershipService"
service="IMembershipService, MyApp"
type="MembershipService, MyApp" lifestyle="PerWebRequest">
<parameters>
<connectionString>#{defaultConnectionString}</connectionString>
</parameters>
</component>
</components>
</castle>
public class WindsorControllerFactory : DefaultControllerFactory {
private WindsorContainer _container;
public WindsorControllerFactory() {
_container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
List<Type> controllerTypes = new List<Type>();
foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) {
if (typeof(IController).IsAssignableFrom(t))
controllerTypes.Add(t);
}
foreach (Type t in controllerTypes) {
// LifestyleType.Transient = new controller instance for each request
_container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
}
}
protected override IController GetControllerInstance(Type controllerType) {
return (IController)_container.Resolve(controllerType);
}
Это все прекрасно работает в моем коде на C #, но я хочу подключить своего провайдера к MVC, чтобы использовать с ним фильтры [Authorize]:
[Authorize (Users="user1, user2", Roles="role8")]
public ViewResult MyResult(int x) {
// implement
}
Я знаю, что обычный способ сообщить ASP.NET о настраиваемом поставщике членства или ролей в файле web.config, как показано ниже, но если я сделаю это, ASP.NET просто попытается вызвать конструктор по умолчанию, который выиграл ' т работа. Любая помощь приветствуется.
<membership>
<providers>
<clear/>
<add name="MyMembershipProvider" type="MyMembershipProvider">
</providers>
</membership>