J'ai un fournisseur d'adhésion/de rôles personnalisé que j'utilise dans mes contrôleurs MVC et que je souhaite également rendre accessible à ASP.NET MVC, afin de pouvoir utiliser AuthorizationFilters, etc. Étant donné que de nombreuses personnes ont mis en œuvre des fournisseurs personnalisés, j'imagine que beaucoup de personnes ont fait cela, mais je n'ai pas trouvé de solution ou d'articles qui traitent spécifiquement de ce problème. Ce poste est en quelque sorte l'envers de ma question. Dans mon cas, mon fournisseur personnalisé fonctionne bien avec mes contrôleurs, et je veux que MVC l'utilise aussi.
Mon fournisseur est mis en œuvre avec une conception IoC/Injection de dépendance. Le fournisseur expose des fonctionnalités supplémentaires au-delà de l'API de base pour les membres et les rôles. Dans mes contrôleurs, j'utilise Castle Windsor pour créer des instances. Le code ressemble à ceci :
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);
}
Tout cela fonctionne parfaitement dans mon code C#, mais je veux intégrer mon fournisseur dans MVC pour utiliser les filtres [Authorize] avec lui :
[Authorize (Users="user1, user2", Roles="role8")]
public ViewResult MyResult(int x) {
// implement
}
Je sais que la façon habituelle d'indiquer à ASP.NET l'existence d'un fournisseur d'adhésions ou de rôles personnalisés est de le faire dans le fichier web.config, comme ci-dessous, mais si je fais cela, ASP.NET essaiera simplement d'appeler le constructeur par défaut, ce qui ne fonctionnera pas. Toute aide est appréciée.
<membership>
<providers>
<clear/>
<add name="MyMembershipProvider" type="MyMembershipProvider">
</providers>
</membership>