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;
});
}
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();
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.
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
vergessen Sie nicht, Rollenmanager in ConfigureServices hinzuzufügen
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>() // <--------
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();