Tidak dapat menyelesaikan layanan untuk jenis 'Microsoft.AspNetCore.Identity.UserManager` saat mencoba mengaktifkan' AuthController '

95

Saya mendapatkan kesalahan ini di Pengontrol Login.

InvalidOperationException: Tidak dapat menyelesaikan layanan untuk jenis 'Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]' saat mencoba mengaktifkan 'Automobile.Server.Controllers.AuthController'.

berikut adalah konstruktor Auth Controller:

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

dan inilah ConfigureServices di 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
sumber
22
Tampaknya bagi saya Anda mendaftar IdentityUsersebagai kelas pengguna dasar tetapi kemudian Anda menggunakan Automobile.Models.Account, yang, tentu saja, tidak terdaftar di mana pun oleh Identitas ASP.NET
Federico Dipuma
@FedericoDipuma Terima kasih banyak :) Selesai.
OMID
Bagaimana Anda mengatasinya ..?
Rafael
4
@Lobato di services.AddIdentity cukup ganti IdentityUser dengan kelas Identity User Anda
OMID
1
@OMID mengapa Anda tidak memposting komentar Anda sebagai jawaban, ini menyelamatkan saya tetapi setelah sakit kepala yang serius dari RnD ..
Pointer Null

Jawaban:

89

Anda perlu menggunakan model data pengguna yang sama di SignInManager, UserManager, dan services.AddIdentity. Prinsip yang sama berlaku jika Anda menggunakan kelas model peran aplikasi kustom Anda sendiri.

Jadi, ganti

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

untuk

services.AddIdentity<Automobile.Models.Account, IdentityRole>(options =>
    {
        options.User.RequireUniqueEmail = false;
    })
    .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
    .AddDefaultTokenProviders();
HojjatK
sumber
2
Saya memiliki masalah yang sama, pengguna dan peran pelanggan saya telah ditentukan di metode AddIdentity dan saya masih mendapatkan kesalahan yang sama. Tahu kenapa? Saya dapat memposting kode saya di utas terpisah.
devC
1
Sebenarnya, saya menyelesaikan masalah itu, tetapi sekarang menghadapi masalah dengan membuat koneksi DB. Saya akan memposting masalahnya.
devC
Sepertinya string koneksi Anda belum diatur dengan benar, lihat jawaban saya di posting Anda.
HojjatK
49

Hanya untuk memperjelas jawabannya:

Jika Anda menggunakan kelas ApplicationUserdi startup.cs:services.AddIdentity<ApplicationUser, IdentityRole>()

maka Anda harus menggunakan kelas yang sama di pengontrol Anda saat memasukkannya:

public AccountController(UserManager<ApplicationUser> userManager)

Jika Anda menggunakan kelas lain seperti:

public AccountController(UserManager<IdentityUser> userManager)

maka Anda akan mendapatkan kesalahan ini:

InvalidOperationException: Tidak dapat menyelesaikan layanan untuk jenis 'Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]'

karena Anda digunakan ApplicationUserdalam startup, tidak IdentityUserjadi tipe ini tidak terdaftar dengan sistem injeksi.

Greg Gum
sumber
6
Ini dihitung untuk semua referensi, jadi jika Anda mengimplementasikan identitas Razor baru untuk asp.net core 2.1 untuk menggantikan sistem identitas lama Anda, Anda perlu mengganti implementasi otomatisnya untuk hal-hal seperti SignInManager <IdentityUser> ke SignInManager <ApplicationUser> di mana pun ia digunakan. Ini bisa mengganggu. Anda juga perlu merutekan ulang dari normal / Akun / Masuk ke / Identitas / Akun / Masuk dll. Hanya beberapa tip untuk membantu;)
Johan Herstad
15

Ini sedikit tidak terkait dengan postingan asli tetapi karena Google membawa Anda ke sini ... jika Anda mendapatkan kesalahan ini dan menggunakan:

services.AddIdentityCore<YourAppUser>()

Kemudian Anda perlu mendaftarkan hal-hal yang AddIdentitymelakukannya secara manual , yang dapat ditemukan di sini: 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>>();

Anda harus mengganti TUserdan TRoledengan penerapannya, atau default IdentityUser,IdentityRole

Serj Sagan
sumber
Harus membuat SignInManager kustom dan ini memperbaikinya, jika Anda berencana untuk melakukannya periksa github.com/dotnet/docs/issues/14828
perustaja
Saya awalnya memulai rute ini tetapi menemukan solusinya di sini ( stackoverflow.com/a/60752194/1146862 ) lebih mudah; Satu-satunya perubahan yang harus saya lakukan (setelah memesan ulang AddIdentitydan AddJwtBeareradalah mengatur ketiga opsi yang ditunjukkan dalam contoh; saya hanya telah menggunakan DefaultAuthenticationScheme. Saya masih mendapatkan cookie kembali saat masuk, tetapi [Authorize]sekarang berfungsi untuk token JWT tanpa menentukan AuthenticationSchema.
Aaron
4

jangan lupa untuk menambahkan manajer peran di ConfigureServices

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

Anda dapat menyetel IdentityUser dan IdentityRole di ConfigureServices di dalam kelas Startup satu per satu seperti yang ditunjukkan di bawah ini:

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

ATAU

Anda dapat mengonfigurasi langsung ke AddIdentity:

services.AddIdentity<IdentityUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();
Mahavirsinh Padhiyar
sumber
4
Dengan jawaban hanya kode, OP dan orang lain tidak akan belajar tentang masalah tersebut, pertimbangkan untuk mengedit jawaban Anda dan menambahkan penjelasan
Cleptus
0

Jika Anda menggunakan "IdentityServer", maka IdentityServer mengautentikasi pengguna dan mengotorisasi klien. Secara default, IdentityServer sebenarnya bukan tentang manajemen pengguna. Tetapi ada beberapa dukungan untuk Identitas asp.net

Jadi, Anda perlu menambahkan:

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

Anda perlu memperbarui kelas Statup.cs Anda dengan di bawah ini

services.AddIdentity <ApplicationUser, IdentityRole> () .AddEntityFrameworkStores ();

Di sini: ApplicationUser adalah kelas model kustom saya.

Gaurav Joshi
sumber