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>
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
Sembra che il progetto webdotnet stia attualmente spostando il suo repository su mercurial, il collegamento è interrotto :-( –
progetto webdotnet up :-) –