template tag net mvc cshtml asp _layout asp.net-mvc dependency-injection asp.net-membership castle-windsor

tag - Cómo integrar el proveedor de membresía de IoC con ASP.NET MVC



partial view mvc 5 (1)

La forma más sencilla de hacer que esto funcione es usar el mecanismo estándar de <membership> ASP.NET en web.config. Simplemente deje que use el constructor predeterminado, pero anule Initialize () y extraiga las dependencias allí. Use this como referencia.

Personalmente, debido a cosas como esta, prefiero evitar el modelo del proveedor por completo, así que uso un enfoque similar al descrito en los documentos de MonoRail . En mi humilde opinión es menos hinchado y más flexible. Al final, solo se trata de configurar HttpContext.User con una implementación principal de IPrincipal , que es lo que utiliza el AuthorizeAttribute.

Recientemente hice un blog sobre una solución para hacer la IoC adecuada con MembershipProviders .

Tengo un proveedor de roles / membresía personalizado que uso en mis controladores MVC que también quiero tener disponible para ASP.NET MVC, así que puedo usar los Filtros de Autorización, etc. Como muchas personas han implementado proveedores personalizados, me imagino que mucha gente lo ha hecho esto, pero no lo he descubierto o encontrado publicaciones que abordan este problema específicamente. Este post es una especie de otra cara de mi pregunta. En mi caso, tengo a mi proveedor personalizado trabajando bien con mis controladores, y quiero que MVC lo use también.

Mi proveedor está implementado con un diseño de inyección de dependencia / IoC. El proveedor expone funcionalidad adicional más allá de la API de membresía / roles de línea de base. En mis controladores, uso Castle Windsor para crear instancias. El código es similar 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); }

Todo esto funciona muy bien en mi código C #, pero quiero conectar a mi proveedor a MVC para que use los filtros [Autorizar]:

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

Sé que la forma habitual de informar a ASP.NET sobre una membresía personalizada o un proveedor de roles es en el archivo web.config como se muestra a continuación, pero si lo hago, ASP.NET solo intentará llamar al constructor predeterminado, que no funcionará. Cualquier ayuda apreciada.

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