Domanda

Ho un provider di appartenenza / ruoli personalizzato che utilizzo nei miei controller MVC che voglio anche avere accesso ad ASP.NET MVC, in modo da poter utilizzare i filtri di autorizzazione, ecc. Dal momento che così tante persone hanno implementato provider personalizzati, immagino molti la gente l'ha fatto ma non l'ho capito o non ho trovato post che affrontano questo problema in modo specifico. 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 all'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 funziona benissimo nel mio codice C # ma voglio collegare il mio provider a MVC per usare i filtri [Autorizza]:

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

So che il solito modo per dire ad ASP.NET di un provider di ruoli o appartenenza personalizzato è nel file web.config come di seguito, ma se lo faccio ASP.NET proverà a chiamare il costruttore predefinito, che ha vinto ' non funziona. Qualsiasi aiuto è stato apprezzato.

<membership>
 <providers>
  <clear/>
  <add name="MyMembershipProvider" type="MyMembershipProvider">
 </providers>
</membership>
È stato utile?

Soluzione

Il modo più semplice per farlo funzionare è utilizzare il meccanismo standard di ASP.NET di <membership> in web.config. Basta lasciarlo usare il costruttore predefinito ma sovrascrivendo Initialize () e pull le dipendenze lì. Usa questo come riferimento.

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

Di recente ho scritto un blog su una soluzione per eseguire l'IoC corretto con MembershipProviders .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top