176 votes

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

    }
 

166voto

HojjatK Points 321

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

85voto

Greg Gum Points 1441

Juste pour être clair au sujet de la réponse:

Si vous utilisez la classe ApplicationUser en démarrage.cs: services.AddIdentity<ApplicationUser, IdentityRole>()

ensuite, vous devez utiliser la même classe dans votre contrôleur lors de l'injection:

public AccountController(UserManager<ApplicationUser> userManager)

Si vous utilisez une autre classe, par exemple:

public AccountController(UserManager<IdentityUser> userManager)

ensuite, vous obtiendrez ce message d'erreur:

InvalidOperationException: Impossible de résoudre un service de type " Microsoft.AspNetCore.L'identité.UserManager`1[IdentityUser]'

parce que vous avez utilisé ApplicationUser au démarrage, pas IdentityUser donc ce type n'est pas enregistré avec le système d'injection.

46voto

Serj Sagan Points 2731

C'est un peu sans rapport avec le post original, mais depuis que Google vous amène ici... si vous obtenez cette erreur, et sont à l'aide de:

services.AddIdentityCore<YourAppUser>()

Ensuite, vous aurez besoin d'enregistrer manuellement les trucs qu' AddIdentity , ce qui peut être trouvé 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 aurez besoin de le remplacer TUser et TRole avec vos implémentations de ces, ou la valeur par défaut IdentityUser, IdentityRole

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X