18 votes

Comment intégrer le fournisseur d'adhésion IoC à ASP.NET MVC ?

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>

24voto

Mauricio Scheffer Points 70470

Le moyen le plus simple de faire fonctionner cette fonction est d'utiliser le mécanisme standard d'ASP.NET, qui consiste à utiliser les fonctions suivantes <membership> dans web.config. Vous le laissez simplement utiliser le constructeur par défaut mais vous surchargez Initialize() et tirer les dépendances à cet endroit. Utiliser ce comme référence.

Personnellement, pour des raisons de ce genre, je préfère éviter complètement le modèle de fournisseur et j'utilise donc une approche similaire à celles qui sont décrites ci-dessous. décrit dans les documents de MonoRail . À mon avis, il est moins lourd et plus souple. En fin de compte, il s'agit simplement de paramétrer HttpContext.User avec une IPrincipal qui est ce que l'attribut AuthorizeAttribute utilise.

J'ai récemment J'ai parlé d'une solution permettant de réaliser un IoC correct avec les MembershipProviders. .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X