web-dev-qa-db-fra.com

Impossible de résoudre le service pour le type 'Microsoft.AspNetCore.Identity.UserManager` lors de la tentative d'activation de' AuthController '

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;
        });

    }
48
OMID

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();
53
HojjatK

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.

30
Greg Gum

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

4
Serj Sagan

n'oubliez pas d'ajouter le gestionnaire de rôles dans ConfigureServices

services.AddDefaultIdentity<IdentityUser>()
    .AddRoles<IdentityRole>() // <--------
    .AddDefaultUI(UIFramework.Bootstrap4)
    .AddEntityFrameworkStores<ApplicationDbContext>();
1
Ozzy