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;
});
}
IdentityUser
sebagai kelas pengguna dasar tetapi kemudian Anda menggunakanAutomobile.Models.Account
, yang, tentu saja, tidak terdaftar di mana pun oleh Identitas ASP.NETJawaban:
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();
sumber
Hanya untuk memperjelas jawabannya:
Jika Anda menggunakan kelas
ApplicationUser
di 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:
karena Anda digunakan
ApplicationUser
dalam startup, tidakIdentityUser
jadi tipe ini tidak terdaftar dengan sistem injeksi.sumber
Ini sedikit tidak terkait dengan postingan asli tetapi karena Google membawa Anda ke sini ... jika Anda mendapatkan kesalahan ini dan menggunakan:
Kemudian Anda perlu mendaftarkan hal-hal yang
AddIdentity
melakukannya secara manual , yang dapat ditemukan di sini: https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityServiceCollectionExtensions.cs#L79services.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
TUser
danTRole
dengan penerapannya, atau defaultIdentityUser
,IdentityRole
sumber
AddIdentity
danAddJwtBearer
adalah mengatur ketiga opsi yang ditunjukkan dalam contoh; saya hanya telah menggunakanDefaultAuthenticationScheme
. Saya masih mendapatkan cookie kembali saat masuk, tetapi[Authorize]
sekarang berfungsi untuk token JWT tanpa menentukan AuthenticationSchema.jangan lupa untuk menambahkan manajer peran di ConfigureServices
services.AddDefaultIdentity<IdentityUser>() .AddRoles<IdentityRole>() // <-------- .AddDefaultUI(UIFramework.Bootstrap4) .AddEntityFrameworkStores<ApplicationDbContext>();
sumber
Anda dapat menyetel IdentityUser dan IdentityRole di ConfigureServices di dalam kelas Startup satu per satu seperti yang ditunjukkan di bawah ini:
ATAU
Anda dapat mengonfigurasi langsung ke AddIdentity:
sumber
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:
sumber
Anda perlu memperbarui kelas Statup.cs Anda dengan di bawah ini
services.AddIdentity <ApplicationUser, IdentityRole> () .AddEntityFrameworkStores ();
Di sini: ApplicationUser adalah kelas model kustom saya.
sumber