none
Configurar Asp.net Identity con Unity RRS feed

  • Pregunta

  • Hola, estaba agregando la autentificación a mi proyecto, estoy utilizando la misma que trae un proyecto Asp.net mvc por defecto, sin embargo estoy utilizando Unity para la Inyección de Dependencias y me esta dando el siguiente error :

    The current type, Microsoft.AspNet.Identity.IUserStore`1[Project.WebUI.Models.ApplicationUser], is an interface and cannot be constructed. Are you missing a type mapping?

    Y este es mi controlador:

        public class AccountController : Controller
        {
            private ApplicationSignInManager _signInManager;
            private ApplicationUserManager _userManager;
            private IPersonRepository repository;
            DBContext context = new DBContext();
    
            public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, IPersonRepository repo)
            {
                UserManager = userManager;
                SignInManager = signInManager;
                repository = repo;
            }

    Que puedo hacer en este caso y porque funciona en un proyecto starter de Asp.net y no en un proyecto con Inyección de dependencias?

    Gracias

    lunes, 23 de noviembre de 2015 3:26

Respuestas

  • Hola...

    Viendo la solución de este enlace 

    http://stackoverflow.com/questions/24731426/register-iauthenticationmanager-with-unity

    hacen lo siguiente a la hora de registrar

    container.RegisterType<DbContext, ApplicationDbContext>(
        new HierarchicalLifetimeManager());
    container.RegisterType<UserManager<ApplicationUser>>(
        new HierarchicalLifetimeManager());
    container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
        new HierarchicalLifetimeManager());
    
    container.RegisterType<AccountController>(
        new InjectionConstructor());
    También echa un vistazo a http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Erick Salazar miércoles, 25 de noviembre de 2015 22:41
    miércoles, 25 de noviembre de 2015 8:21
    Moderador

Todas las respuestas

  • Hola, cómo has configurado el contenedor Uniuty de dependencias?

    Lo más seguro es que no esté resolviendo bien


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 23 de noviembre de 2015 8:04
    Moderador
  • hola

    Que clases estas utilizando cuando defines el Register

    How To : ASP.NET MVC With Microsoft Identity and Unity Bootstrapper

    ademas e tu controller no deberias poner clases concretas sino quzias el

    IUserStore<ApplicationUser>

    parsa quela librerias de IoC resuelva y pueda inyectar la dependencia

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 23 de noviembre de 2015 18:35
  • Hola Sergio, esta es mi configuración del Unity

            public static void RegisterTypes(IUnityContainer container)
            {
                // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
                // container.LoadConfiguration();
    
                // TODO: Register your types here
                container.RegisterType<IAdoptionRepository, AdoptionRepository>();
                container.RegisterType<ICommentRepository, CommentRepository>();
                container.RegisterType<INewRepository, NewRepository>();
                container.RegisterType<IOrganizationRepository, OrganizationRepository>();
                container.RegisterType<IPersonRepository, PersonRepository>();
                container.RegisterType<IImageRepository, ImageRepository>();
                container.RegisterType<IPetRepository, PetRepository>();
                container.RegisterType<ITransactionRepository, TransactionRepository>();
            }
    Te comento que antes de agregar el Identity todo me funcionaba bien, es decir mi controlador solo recibía como parametro el repositorio.

    martes, 24 de noviembre de 2015 5:46
  • Hola Leandro, vi tu link y bueno... sospechaba que había que hacer inyección de dependencias a estas clases, ya habia intentado agregar lo siguiente: 

                // TODO: Asp.Net Identity DI
                //container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
                //container.RegisterType<UserManager<ApplicationUser>>();
                //container.RegisterType<DbContext, ApplicationDbContext>();
                //container.RegisterType<ApplicationUserManager>();
                //container.RegisterType<AccountController>(new InjectionConstructor(typeof(ApplicationUserManager), typeof(ApplicationSignInManager), typeof(IPersonRepository)));

    Sin embargo me da error en la ultima linea, la del controlador porque no le puse los parámetros supongo, despues googleando un poco vi ese método utilizando typeof, no se si es correcto, igual recibo otro error: "The current type, Microsoft.Owin.Security.IAuthenticationManager, is an interface and cannot be constructed. Are you missing a type mapping?"

    Cuéntame si esta bien lo del AccountController como lo puse ahí y bueno mi otra conclusión es que debería hacer una clase que implemente esta interfaz, pero realmente no entiendo si es que debo hacer eso o estoy fallando en otra cosa.

    Es la primera vez que hago DI y que uso Identity, de hecho es mi primera aplicación seria que hago en MVC así que disculpa si mis preguntas son poco precisas, y te agradezco por ayudarme en tantas dudas que he tenido no solo en esta pregunta sino en muchas otras.

    martes, 24 de noviembre de 2015 6:05
  • Creo que del último código que has puesto deberías agregar 

    // TODO: Asp.Net Identity DI
    container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
    container.RegisterType<UserManager<ApplicationUser>>();
    container.RegisterType<DbContext, ApplicationDbContext>();
    container.RegisterType<ApplicationUserManager>();
    
    // registrar
    container.RegisterType<ApplicationSignInManager>();
    
    // registrar el controlador a aplicar DI
    container.RegisterType<AccountController>(); 
    
    // Lo comentamos porque ya hemos registrado las dependencias y ya es capaz de resolverlas
    // container.RegisterType<AccountController>(new InjectionConstructor(typeof(ApplicationUserManager), typeof(ApplicationSignInManager), typeof(IPersonRepository)));
    Fijate en lo negrita


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 24 de noviembre de 2015 7:19
    Moderador
  • Hola Sergio, seguí tu consejo pero sigue dandome ese error: "The current type, Microsoft.Owin.Security.IAuthenticationManager, is an interface and cannot be constructed. Are you missing a type mapping?"

    Intenté también agregar container.RegisterType<AuthenticationManager>(); pero tampoco funcionó 

    martes, 24 de noviembre de 2015 18:45
  • Hola...

    Viendo la solución de este enlace 

    http://stackoverflow.com/questions/24731426/register-iauthenticationmanager-with-unity

    hacen lo siguiente a la hora de registrar

    container.RegisterType<DbContext, ApplicationDbContext>(
        new HierarchicalLifetimeManager());
    container.RegisterType<UserManager<ApplicationUser>>(
        new HierarchicalLifetimeManager());
    container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
        new HierarchicalLifetimeManager());
    
    container.RegisterType<AccountController>(
        new InjectionConstructor());
    También echa un vistazo a http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Erick Salazar miércoles, 25 de noviembre de 2015 22:41
    miércoles, 25 de noviembre de 2015 8:21
    Moderador
  • Hola Sergio gracias por tu ayuda, al final probé tu consejo anterior pero probando tener un constructor del controller sin parametros y otro con los parametros y repositorios y al parecer funcionó, no sé si es correcto tener ambos contructores pero no me ha dado ningun problema por ahora. Muchas gracias nuevamente y saludos.
    miércoles, 25 de noviembre de 2015 22:41
  • Hola,

    Tuve el mismo inconveniente. Lo acabo de resolver agregando en UnityConfig.cs, RegisterComponents lo siguiente:

    container.RegisterType<ManageController>(new InjectionConstructor());

    Espero que a alguno le sirva.

    Saludos

    domingo, 29 de septiembre de 2019 10:40