Je reçois cette erreur dans le contrôleur de connexion.
InvalidOperationException: Impossible de résoudre le service pour le type 'Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]' lors de l'activation de 'Automobile.Server.Controllers.AuthController'.
voici le constructeur du contrôleur d'authentification:
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;
}
et voici ConfigureServices dans 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;
});
}
Vous devez utiliser le même modèle de données utilisateur dans SignInManager, UserManager et services.AddIdentity. Le même principe est vrai si vous utilisez votre propre classe de modèle de rôle d'application personnalisée.
Alors, change
services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
.AddDefaultTokenProviders();
à
services.AddIdentity<Automobile.Models.Account, IdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
.AddDefaultTokenProviders();
Juste pour être clair sur la réponse:
Si vous utilisez la classe ApplicationUser
dans startup.cs: services.AddIdentity<ApplicationUser, IdentityRole>()
alors vous devez utiliser la même classe dans votre contrôleur lorsque vous l'injectez:
public AccountController(UserManager<ApplicationUser> userManager)
Si vous utilisez une autre classe telle que:
public AccountController(UserManager<IdentityUser> userManager)
alors vous obtiendrez cette erreur:
InvalidOperationException: impossible de résoudre le service pour le type 'Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]'
parce que vous avez utilisé ApplicationUser
au démarrage, et non IdentityUser
, ce type n'est donc pas enregistré auprès du système d'injection.
Cela n'a rien à voir avec le message d'origine, mais puisque Google vous en fait venir ici ... si vous obtenez cette erreur et utilisez:
services.AddIdentityCore<YourAppUser>()
Ensuite, vous devrez enregistrer manuellement le contenu de AddIdentity
, que vous pouvez trouver ici: https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/ Identity/IdentityServiceCollectionExtensions.cs # L79
services.AddHttpContextAccessor();
// Identity services
services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();
// No interface for the error describer so we can add errors without rev'ing the interface
services.TryAddScoped<IdentityErrorDescriber>();
services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
services.TryAddScoped<ITwoFactorSecurityStampValidator, TwoFactorSecurityStampValidator<TUser>>();
services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();
services.TryAddScoped<UserManager<TUser>>();
services.TryAddScoped<SignInManager<TUser>>();
services.TryAddScoped<RoleManager<TRole>>();
Vous devrez remplacer TUser
et TRole
par vos implémentations, ou la valeur par défaut IdentityUser
, IdentityRole
n'oubliez pas d'ajouter le gestionnaire de rôles dans ConfigureServices
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>() // <--------
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();