tutorial net español asp c# asp.net asp.net-mvc asp.net-core asp.net-core-identity

c# - español - No se puede resolver el servicio para el tipo ''Microsoft.AspNetCore.Identity.UserManager` al intentar activar'' AuthController ''



asp.net identity tutorial español (2)

Estoy recibiendo este error en Login Controller.

InvalidOperationException: no se puede resolver el servicio para el tipo ''Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]'' al intentar activar ''Automobile.Server.Controllers.AuthController''

Aquí está el constructor Auth Controller:

private SignInManager<Automobile.Models.Account> _signManager; private UserManager<Automobile.Models.Account> _userManager; public AuthController(UserManager<Models.Account> userManager, SignInManager<Automobile.Models.Account> signManager) { this._userManager = userManager; this._signManager = signManager; }

y aquí está ConfigureServices en startup.cs:

public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); services.Configure<AppConfig>(Configuration.GetSection("AppSettings")); //var provider = HttpContext.ApplicationServices; //var someService = provider.GetService(typeof(ISomeService)); services.AddDbContext<Providers.Database.EFProvider.DataContext>(options => options .UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("Automobile.Server") )); services.AddIdentity<IdentityUser, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders(); //services.AddScoped<SignInManager<Automobile.Models.Account>, SignInManager<Automobile.Models.Account>>(); //services.AddScoped<UserManager<Automobile.Models.Account>, UserManager<Automobile.Models.Account>>(); services.AddMvc(); App.Service = services.BuildServiceProvider(); // Adds a default in-memory implementation of IDistributedCache. services.AddDistributedMemoryCache(); services.AddSession(options => { // Set a short timeout for easy testing. options.IdleTimeout = TimeSpan.FromSeconds(10); options.CookieHttpOnly = true; }); }


Debe utilizar el mismo modelo de datos de usuario en SignInManager, UserManager y services.AddIdentity. El mismo principio es verdadero si está utilizando su propia clase de modelo de rol de aplicación personalizada.

Entonces cambio

services.AddIdentity<IdentityUser, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();

a

services.AddIdentity<Automobile.Models.Account, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();


Solo para ser claros acerca de la respuesta:

Si usa la clase ApplicationUser en startup.cs: services.AddIdentity<ApplicationUser, IdentityRole>()

luego debe usar la misma clase en su controlador al inyectarlo:

public AccountController(UserManager<ApplicationUser> userManager)

Si usas alguna otra clase como:

public AccountController(UserManager<IdentityUser> userManager)

entonces obtendrá este error:

InvalidOperationException: no se puede resolver el servicio para el tipo ''Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]''

porque utilizó ApplicationUser en el inicio, no IdentityUser por lo que este tipo no está registrado con el sistema de inyección.