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.