Come integrare il provider di appartenenze IoC con ASP.NET MVC

Ho un provider di appartenenze / ruoli personalizzato che uso nei miei controller MVC che voglio anche avere accesso a ASP.NET MVC, quindi posso usare AuthorizationFilters, ecc. Dal momento che così tante persone hanno implementato provider personalizzati, immagino che molte persone abbiano fatto questo, ma non ho capito o trovato messaggi che affrontano specificamente questo problema. Questo post è una specie di rovescio della mia domanda. Nel mio caso, il mio provider personalizzato funziona bene con i miei controller e voglio che anche MVC lo utilizzi.

Il mio provider è implementato con un progetto di iniezione IoC / dipendenza. Il provider espone funzionalità aggiuntive oltre l’API di appartenenza / ruoli di base. Nei miei controller, utilizzo Castle Windsor per creare istanze. Il codice è simile a:

public class HomeController : Controller { IMembershipService _membershipService; public HomeController(IMembershipService membershipService) { _membershipService= membershipService; } }     #{defaultConnectionString}     public class WindsorControllerFactory : DefaultControllerFactory { private WindsorContainer _container; public WindsorControllerFactory() { _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle"))); List controllerTypes = new List(); 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); } 

Tutto questo funziona perfettamente nel mio codice C # ma voglio colbind il mio provider in MVC per utilizzare i filtri [Autorizza] con esso:

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

So che il solito modo di dire ad ASP.NET di un provider di appartenenze o ruoli personalizzato è nel file web.config come sotto, ma se faccio questo ASP.NET proverò semplicemente a chiamare il costruttore predefinito, che non funzionerà. Qualsiasi aiuto apprezzato.

       

Il modo più semplice per farlo funzionare è utilizzare il meccanismo standard di ASP.NET di in web.config. Basta lasciare che usi il costruttore predefinito, ma sostituisci Initialize () e trascina lì le dipendenze. Usa questo come riferimento.

Personalmente, a causa di cose come questa, preferisco evitare del tutto il modello del provider, quindi uso un approccio simile a quello descritto nei documenti MonoRail . IMHO è meno gonfio e più flessibile. Alla fine, si tratta solo di impostare HttpContext.User con una corretta implementazione IPrincipal che è ciò che utilizza AuthorizeAttribute.

Recentemente ho scritto un blog su una soluzione per fare una corretta IoC con MembershipProviders .