18

Ho un provider di appartenenze/ruoli personalizzato che utilizzo nei miei controller MVC che voglio anche avere accesso a ASP.NET MVC, quindi posso utilizzare AuthorizationFilters, ecc. Dal momento che così tante persone hanno implementato fornitori personalizzati, immagino che molte persone lo abbiano fatto, ma non ho capito o trovato post che affrontino questo problema in modo specifico. This 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.Come integrare il provider di appartenenze IoC con ASP.NET MVC

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; 
    } 
} 

<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); 
    } 

Tutto questo funziona alla grande nel mio codice C#, ma voglio legare il mio fornitore in MVC usare [Autorizza] filtri con esso:

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

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

<membership> 
<providers> 
    <clear/> 
    <add name="MyMembershipProvider" type="MyMembershipProvider"> 
</providers> 
</membership> 

risposta

24

Il modo più semplice per arrivare a questo lavoro è quello di utilizzare meccanismo standard di ASP.NET di <membership> nel web.config. Basta lasciare che usi il costruttore predefinito ma si sostituisce Initialize() e pull le dipendenze lì. Utilizzare this come riferimento.

Personalmente, a causa di cose del genere, preferisco evitare del tutto il modello di provider, quindi uso un approccio simile a quelli described in the MonoRail docs. IMHO è meno gonfio e più flessibile. Alla fine, si tratta solo di impostare HttpContext.User con un'implementazione IPrincipal corretta che è ciò che utilizza AuthorizeAttribute.

Ho recentemente blogged about a solution to do proper IoC with MembershipProviders.

+1

Grazie per questo. Mentre il tuo primo metodo funziona correttamente, come hai detto, la creazione di classi personalizzate IPrincipal/IIdentity offre maggiore flessibilità. Ad esempio, è un breve percorso per creare alcuni tipi diversi di autorizzazione utente/ruolo rispetto a quella fornita da Autenticazione moduli. – keithm

+2

Sembra che il progetto webdotnet stia attualmente spostando il suo repository su mercurial, il collegamento è interrotto :-( –

+0

progetto webdotnet up :-) –

Problemi correlati