4

Ich habe eine ältere asp.net Core Identity-Datenbank, und ich möchte ein neues Projekt (eine Web-API) zuordnen.ASP.NET Core Identity nicht injizieren UserManager <ApplicationUser>

Nur für den Test, kopierte ich den Ordner Modelle, und die ApplicationUser-Datei aus dem vorherigen Projekt (ApplicationUser erbt einfach von IdentityUser, keinerlei Änderungen) - DB zuerst scheint eine schlechte Idee zu sein.

Ich Registrierung Identität in ConfigureServices (aber ich hinzufüge, es nicht zu der Pipeline, da meine einzige Absicht ist es, die Users zu verwenden)

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

Meine Erwartung ist, dass jetzt

 UserManager<ApplicationUser> 

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

Wenn Sie jedoch den folgenden Code zu einem Controller hinzufügen: private UserManager _userManager;

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

... endet jeder Aufruf der api mit einer Ausnahme: HttpRequestException: Antwortstatuscode Erfolg nicht angeben: 500 (Internal Server Error).

Das Entfernen des Codes "injection" führt zu einer reibungslos funktionierenden Web-API, die Anfragen annehmen kann.

Es ist schwer zu debuggen, da dies auftritt, bevor einer meiner Code erreicht ist. Irgendeine Idee, warum das vorkommt?

P.S. Ich alle Ausnahmen von der Ausnahme-Einstellungen-Fenster Nach der Aktivierung bekam diese:

Ausnahme geworfen: ‚System.InvalidOperationException‘ in
Microsoft.Extensions.DependencyInjection.dll

Zusätzliche Informationen: Dienst kann nicht lösen für Geben Sie 'Namespace.Data.ApplicationDbContext' ein, während Sie versuchen, 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4 [Namespace.Models. ApplicationUser, Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole, Namespace.Data.ApplicationDbContext, System.String] '.

+0

hinzufügen vollständige Serverfehler –

Antwort

4

Haben Sie die app.UseIdentity(); Aufruf im Configure Methode haben:

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

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

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

} 

Dies sollte OK funktionieren. Überprüfen Sie auch, ob ApplicationDbContext von IdentityDbContext erbt.

+0

ich oben erwähnt, dass ich nicht (da ich nicht die Absicht, es zu benutzen für die Authentifizierung - nur Userstores). Aber auch nach experimentellem Hinzufügen ist das Ergebnis dasselbe. – nikovn

+2

Ihre Bearbeitung hat es behoben und jetzt ist es mir peinlich. Ich verstecke mein Gesicht für den Rest des Tages ... – nikovn

2

Der DI-Container kann eine Abhängigkeit nicht auflösen.Fügen Sie es zu den Dienstleistungen Sammlung

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

Sie sollten auch machen Sie sich mit dem official documentation

+0

Es ist genau diese Dokumentation, die behauptet, dass alles über DI nach der Verwendung von services.AddIdentity() verfügbar ist, was leider nicht funktioniert. Versucht, diese Lösung zusätzlich zu transienten Benutzer speichert, Passwort-Validatoren und alle sichtbaren Abhängigkeiten im UserStore-Konstruktor - noch nichts. – nikovn

+1

Ok verstanden. Können Sie ein [mcve] des Problems hinzufügen, damit wir Ihr Problem reproduzieren können und in der Lage sind, bessere Antworten zu geben – Nkosi

0
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(); 
    ... 
} 
Verwandte Themen