web-dev-qa-db-de.com

ASP.NET Core Identity fügt UserManager <ApplicationUser> nicht ein

Ich habe eine ältere asp.net-Identitätsdatenbank, und ich möchte ein neues Projekt (eine Web-API) zuordnen.

Nur für den Test habe ich den Models-Ordner und die ApplicationUser-Datei aus dem vorherigen Projekt kopiert (ApplicationUser erbt einfach von IdentityUser, keinerlei Änderungen) - das Ausführen von DB scheint zunächst eine schlechte Idee zu sein.

Ich registriere Identität in ConfigureServices (aber ich füge sie nicht zur Pipeline hinzu, da meine einzige Absicht darin besteht, den UserStore zu verwenden.)

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

Meine Erwartung ist das jetzt 

     UserManager<ApplicationUser>

... sollte automatisch in Konstruktoren eingefügt werden.

Wenn Sie jedoch den folgenden Code zu einem Controller hinzufügen, __. privater UserManager _userManager;

    public UserController(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }

... endet jeder Aufruf der API mit einer Ausnahme: HttpRequestException: Der Antwortstatuscode gibt keinen Erfolg an: 500 (Interner Serverfehler).

Das Entfernen des "Injection" -Codes führt zu einem reibungslos laufenden Web-API, das Anforderungen annehmen kann.

Es ist schwer zu debuggen, da dies geschieht, bevor mein Code erreicht wird. Irgendeine Idee, warum dies geschieht?

P.S. Nachdem ich alle Ausnahmen im Fenster "Ausnahmeeinstellungen" aktiviert hatte, erhielt ich folgende:

Ausnahme ausgelöst: 'System.InvalidOperationException' in
Microsoft.Extensions.DependencyInjection.dll

Zusätzliche Informationen: Dienst für Typ .__ kann nicht aufgelöst werden. "Namespace.Data.ApplicationDbContext" beim Versuch, .__ zu aktivieren. "Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore" 4 [Namespace.Models . ApplicationUser, Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole, Namespace.Data.ApplicationDbContext, System.String] '.

6
nikovn

Haben Sie den app.UseIdentity();-Aufruf in der Configure-Methode:

 public void Configure(IApplicationBuilder app, 
                       IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        /*...*/
        app.UseIdentity();
       /*...*/          
    }

EDIT Haben Sie auch diese Zeile vor der services.AddIdentity<ApplicationUser, IdentityRole>()-Zeile?

 public void ConfigureServices(IServiceCollection services)
 {
        // Add framework services.
        services.AddDbContext<ApplicationDbContext>(options =>
             options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

 }

Das sollte funktionieren. Bitte überprüfen Sie auch, ob ApplicationDbContext von IdentityDbContext erbt.

7

DI-Container kann eine Abhängigkeit nicht auflösen. Fügen Sie es der Services-Sammlung hinzu

services.AddTransient<UserManager<ApplicationUser>>();
services.AddTransient<ApplicationDbContext>();

Sie sollten sich auch mit der offiziellen Dokumentation vertraut machen.

4
Nkosi
public void ConfigureServices(IServiceCollection services){
...
var identityBuilder = services.AddIdentityCore<ApplicationUser>(user =>
            {
                // configure identity options
                user.Password.RequireDigit = true;
                user.Password.RequireLowercase = false;
                user.Password.RequireUppercase = false;
                user.Password.RequireNonAlphanumeric = false;
                user.Password.RequiredLength = 6;
            });
            identityBuilder = new IdentityBuilder(identityBuilder.UserType, typeof(IdentityRole), identityBuilder.Services);
            identityBuilder.AddEntityFrameworkStores<DbContext>().AddDefaultTokenProviders();
    ...
}
0
Lakmal