Question

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 implémenté des fournisseurs personnalisés, j'imagine que de nombreux les gens l'ont fait mais je ne l'ai pas compris ni trouvé de commentaires qui traitent spécifiquement de ce problème. Ce billet est en quelque sorte un revers 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 implémenté avec une conception d'injection IoC / dependency. Le fournisseur expose des fonctionnalités supplémentaires au-delà de l'API d'appartenance / rôles de base. Dans mes contrôleurs, j'utilise Castle Windsor pour créer des instances. Le code ressemble à:

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 très bien dans mon code C #, mais je souhaite connecter mon fournisseur à MVC pour qu'il utilise les filtres [Autoriser]:

[Authorize (Users="user1, user2", Roles="role8")]
public ViewResult MyResult(int x) {
    // implement
}

Je sais que la méthode habituelle pour informer ASP.NET d'un fournisseur d'appartenance personnalisé ou de rôles est d'utiliser le fichier web.config ci-dessous, mais si je le fais, ASP.NET tentera simplement d'appeler le constructeur par défaut, qui a t fonctionne. Toute aide appréciée.

<membership>
 <providers>
  <clear/>
  <add name="MyMembershipProvider" type="MyMembershipProvider">
 </providers>
</membership>
Était-ce utile?

La solution

Le moyen le plus simple de le faire fonctionner consiste à utiliser le mécanisme standard d’ASP.NET de <membership> dans web.config. Vous le laissez simplement utiliser le constructeur par défaut , mais vous écrasez Initialize () et en tirez les dépendances. Utilisez ceci . comme référence.

Personnellement, à cause de choses comme celle-ci, je préfère éviter complètement le modèle de fournisseur, donc j'utilise une approche similaire à celle décrit dans les documents MonoRail . IMHO c'est moins gonflé et plus flexible. En fin de compte, il s’agit simplement de configurer HttpContext.User avec une mise en œuvre appropriée de IPrincipal qui est ce que AuthorizeAttribute utilise.

J'ai récemment publié sur un blog une solution permettant de faire de la bonne analyse des connaissances avec MembershipProviders .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top