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;
});
}
IdentityUser
alsAutomobile.Models.Account
Antworten:
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
zu
quelle
Nur um die Antwort klar zu machen:
Wenn Sie die Klasse
ApplicationUser
in startup.cs verwenden:services.AddIdentity<ApplicationUser, IdentityRole>()
Dann müssen Sie beim Injizieren dieselbe Klasse in Ihrem Controller verwenden:
Wenn Sie eine andere Klasse verwenden, z.
dann erhalten Sie diesen Fehler:
Da Sie
ApplicationUser
beim Start verwendet haben, istIdentityUser
dieser Typ nicht beim Einspritzsystem registriert.quelle
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:
Anschließend müssen Sie die entsprechenden Funktionen manuell registrieren. Diese
AddIdentity
finden Sie hier: https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityServiceCollectionExtensions.cs#L79Sie werden ersetzen müssen
TUser
undTRole
mit Implementierungen von denen, oder dem StandardIdentityUser
,IdentityRole
quelle
Vergessen Sie nicht, in ConfigureServices einen Rollenmanager hinzuzufügen
quelle
Sie können IdentityUser und IdentityRole in ConfigureServices in der Startup-Klasse einzeln festlegen, wie unten gezeigt:
ODER
Sie können direkt in AddIdentity konfigurieren:
quelle
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:
quelle