wake-up-neo.com

Dienst für Typ "Microsoft.AspNetCore.Identity.UserManager" kann beim Versuch, "AuthController" zu aktivieren, nicht aufgelöst werden

Ich erhalte diesen Fehler in Login Controller.

InvalidOperationException: Der Dienst für den Typ "Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]" konnte beim Versuch, "Automobile.Server.Controllers.AuthController" zu aktivieren, nicht aufgelöst werden.

hier ist der Auth Controller-Konstruktor:

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

und hier ist ConfigureServices in 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

Sie müssen dasselbe Benutzerdatenmodell in SignInManager, UserManager und services.AddIdentity verwenden. Dasselbe Prinzip gilt, wenn Sie Ihre eigene benutzerdefinierte Anwendungsrollenmodellklasse verwenden.

Also, ändere dich

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

zu

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

Um die Antwort klar zu formulieren:

Wenn Sie die Klasse ApplicationUser in startup.cs verwenden: services.AddIdentity<ApplicationUser, IdentityRole>()

dann müssen Sie dieselbe Klasse in Ihrem Controller verwenden, wenn Sie sie injizieren:

public AccountController(UserManager<ApplicationUser> userManager)

Wenn Sie eine andere Klasse verwenden, wie zum Beispiel:

public AccountController(UserManager<IdentityUser> userManager)

dann erhalten Sie diesen Fehler:

InvalidOperationException: Dienst für Typ "Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]" kann nicht aufgelöst werden

da Sie beim Start ApplicationUser und nicht IdentityUser verwendet haben, ist dieser Typ nicht im Einspritzsystem registriert.

30
Greg Gum

Dies hat etwas nichts mit dem ursprünglichen Beitrag zu tun, aber da Google Sie hierher bringt ... wenn Sie diesen Fehler erhalten und Folgendes verwenden:

services.AddIdentityCore<YourAppUser>()

Anschließend müssen Sie das Material, das AddIdentity ausführt, manuell registrieren. Dies finden Sie hier: 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>>();

Sie müssen TUser und TRole durch Ihre Implementierungen ersetzen, oder die Standard-IdentityUser, IdentityRole

4
Serj Sagan

vergessen Sie nicht, Rollenmanager in ConfigureServices hinzuzufügen

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