Dienst für Typ 'Microsoft.AspNetCore.Identity.UserManager' kann nicht aufgelöst werden, während versucht wird, 'AuthController' zu aktivieren.

87

Ich erhalte diesen Fehler im Login Controller.

InvalidOperationException: Dienst für Typ 'Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]' kann nicht aufgelöst werden, während versucht wird, 'Automobile.Server.Controllers.AuthController' zu aktivieren.

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

    }
OMID
quelle
19
Es scheint mir, dass Sie sich IdentityUserals Automobile.Models.Account
Basisbenutzerklasse
@FedericoDipuma Vielen Dank :) Gelöst.
OMID
Wie hast du es gelöst ..?
Rafael
4
@Lobato in services.AddIdentity ersetzen Sie IdentityUser einfach durch Ihre Identity User-Klasse
OMID
1
@OMID warum postest du deinen Kommentar nicht als Antwort, das hat mich gerettet, aber nach einigen ernsthaften Kopfschmerzen von RnD ..
Null Pointer

Antworten:

85

Sie müssen dasselbe Benutzerdatenmodell in SignInManager, UserManager und services.AddIdentity verwenden. Das gleiche 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();
HojjatK
quelle
2
Ich habe das ähnliche Problem, ich habe meinen Kundenbenutzer und meine Kundenrolle in der AddIdentity-Methode definiert und erhalte immer noch den gleichen Fehler. Irgendeine Idee warum? Ich könnte meinen Code in einem separaten Thread veröffentlichen.
DevC
1
Eigentlich habe ich dieses Problem behoben, aber jetzt ist ein Problem beim Erstellen der DB-Verbindung aufgetreten. Ich werde das Problem posten.
DevC
Anscheinend wurde Ihre Verbindungszeichenfolge nicht richtig eingestellt. Lesen Sie meine Antwort in Ihrem Beitrag.
HojjatK
48

Nur um die Antwort klar zu machen:

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

Dann müssen Sie beim Injizieren dieselbe Klasse in Ihrem Controller verwenden:

public AccountController(UserManager<ApplicationUser> userManager)

Wenn Sie eine andere Klasse verwenden, z.

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 ApplicationUserbeim Start verwendet haben, ist IdentityUserdieser Typ nicht beim Einspritzsystem registriert.

Greg Gum
quelle
6
Dies gilt für alle Referenzen. Wenn Sie also die neue Razor-Identität für asp.net Core 2.1 implementieren, um Ihr altes Identitätssystem zu ersetzen, müssen Sie die automatische Implementierung von Dingen wie SignInManager <IdentityUser> durch SignInManager <ApplicationUser> ersetzen, wo immer sie verwendet wird. Das kann ärgerlich sein. Außerdem müssen Sie von normal / Konto / Login zu / Identität / Konto / Login usw.
umleiten,
13

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 die entsprechenden Funktionen manuell registrieren. Diese AddIdentityfinden 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 werden ersetzen müssen TUserund TRolemit Implementierungen von denen, oder dem Standard IdentityUser,IdentityRole

Serj Sagan
quelle
Musste einen benutzerdefinierten SignInManager erstellen und dies hat es behoben, wenn Sie dies
vorhaben,
4

Vergessen Sie nicht, in ConfigureServices einen Rollenmanager hinzuzufügen

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

Sie können IdentityUser und IdentityRole in ConfigureServices in der Startup-Klasse einzeln festlegen, wie unten gezeigt:

services.AddDefaultIdentity<IdentityUser>()
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

ODER

Sie können direkt in AddIdentity konfigurieren:

services.AddIdentity<IdentityUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();
Mahavirsinh Padhiyar
quelle
2
Mit einer Nur-Code-Antwort werden OP und andere kaum etwas über das Problem erfahren. Bearbeiten Sie Ihre Antwort und fügen Sie eine Erklärung hinzu
Cleptus
0

Wenn Sie "IdentityServer" verwenden, damit IdentityServer den Benutzer authentifiziert und den Client autorisiert. Standardmäßig geht es bei IdentityServer eigentlich nicht um die Benutzerverwaltung. Es gibt jedoch eine gewisse Unterstützung für asp.net Identity

Sie müssen also hinzufügen:

services.AddIdentityServer()
    .AddAspNetIdentity<ApplicationUser>();
Amirhossein Yari
quelle