6

zu implementieren Ich versuche, das Schwarze Loch zu navigieren, die die benutzerdefinierte Implementierung von Identity-Mitgliedschaft ist. Mein Ziel ist im Moment einfach diese Zeile von meinem ApiController zu bekommen, um richtig meine Usermanager abrufen:Erfolgreich benutzerdefinierte Benutzer-Manager <IUser> in Identity 2.0

public IHttpActionResult Index() 
{ 
    var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<MyUser,int>>(); 
    //manager is null 
} 

Hier ist mein Setup. In meinem Startup ‚s Konfiguration stelle ich die WebAPI und meine OwinContext hinzufügen:

app.CreatePerOwinContext<UserManager<MyUser,int>>(Create); 

Methode eröffne mein:

public static UserManager<User,int> Create(IdentityFactoryOptions<UserManager<MyUser,int>> options, IOwinContext context) 
{ 
    return new UserManager<MyUser,int>(new UserStore(new DbContext())); 
} 

der Rest der grundlegendsten Implementierung ist die ich machen kann.

MyUser:

public class MyUser : IUser<int> 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
} 

MyUserStore:

public class MyUserStore : IUserStore<MyUser,int> 
{ 
    private IdentityDbContext context; 
    public MyUserStore(IdentityDbContext c) 
    { 
     context = c; 
    } 

    //Create,Delete, etc implementations 
} 

MyDbContext:

public class MyDbContext : IdentityDbContext 
{ 
    public MyDbContext() : base("Conn") 
    { 

    } 
} 

Das ist alles zum Wohle des Lernens, wie Identität arbeitet, die ich ziemlich überzeugt bin kein man weiß es wirklich. Ich möchte in der Lage sein, meine Benutzer und Rollen vollständig anzupassen, indem ich den IdentityUser von Microsoft vermeide.

Wieder ist mein Problem im Moment, dass ich in meinem Controller null bekomme, wenn ich versuche, meinen UserManager abzurufen.

Jede und alle Hilfe wird sehr geschätzt.

+0

Ziemlich große Aussage über "zu lernen, wie Identität funktioniert, von der ich ziemlich überzeugt bin, dass niemand wirklich weiß". Quellcode weiß. Quellcode ist über Decompiler verfügbar. – trailmax

+1

Das war eher ein Ausdruck meiner Frustration, als ich nicht viele Beispiele finden konnte – Jonesopolis

Antwort

3

hatte ich mehrere Fehler, aber der Hauptgrund war, dass meine Startup-Klasse sah aus wie:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseWebApi(new WebApiConfig()); 

     app.CreatePerOwinContext(MyDbContext.Create); 
     app.CreatePerOwinContext<MyUserManager>(MyUserManager.Create); 
    } 
} 

Natürlich wird stecken die OWIN Pipeline abzufeuern meine Abhängigkeiten nach die WebAPI Anrufe. Das Umdrehen war mein Hauptproblem.

Darüber hinaus fand ich schließlich this great guide ganz unten in meiner Google-Suche. Es beantwortet so ziemlich alles, worauf ich hinauswollte. Ich musste eine konkrete Klasse implementieren, die ein UserManager<MyUser,int>

war Ich hoffe, dass dies in der Lage ist, jemandem später zu helfen.

1

Verwenden Sie MyIdentity.User oder MyIdentity.MyUser? Sie haben zwei verschiedene Objekte, die in Ihren Beispielen an den TUser-Parameter übergeben wurden.

Ich habe Ihre Implementierung getestet und hatte keine Probleme beim Abrufen der registrierten Instanz des UserManagers.

Um Ihre Benutzer und Rollen vollständig anzupassen, müssen Sie am Ende eine neue Implementierung des UserManagers schreiben, damit Ihre Authentifizierung, Ansprüche, Rollen, Methodenaufrufe usw. funktionieren.

Wenn Sie versuchen zu lernen, wie Identität funktioniert, würde ich vorschlagen, mit der Standardimplementierung von UserManager und IdentityUser arbeiten. Bring das zuerst zum Laufen.

Here is a good tutorial

Schließlich erstellen Sie Ihre eigenen Benutzer IdentityUser implementieren. Alle Funktionen von UserManager funktionieren und Sie haben Zugriff auf Ihre neuen Eigenschaften. Die zusätzlichen Eigenschaften werden automatisch in die vom IdentityDbContext generierte AspnetUser-Tabelle integriert.

public MyIdentityUser : IdentityUser 
{ 
    public int Id {get; set;} 
    public string CustomUserId {get; set;} 
    public string UserId { get; set; } 
} 

Oder Sie können den Aufbau Ihrer benutzerdefinierten MyIdentityUser mit Fremdschlüssel Verweise auf andere Objekte starten.

public MyIdentityUser : IdentityUser 
{ 
    public virtual UserProperties Properties { get; set; } 
} 

Hilft Ihnen das?

+0

Danke Scott. Ich hatte meinen Unterricht geändert und als ich die Frage bearbeitet hatte, machte ich einen schlechten Job, um das konsequent zu halten. Mein Hauptthema habe ich in einer Antwort selbst gepostet, aber deine ist auch sehr hilfreich. Kennen Sie die Vorteile von IdentityUser vs. IUser? – Jonesopolis

+0

IUser wird von IdentityUser implementiert, einem Vertrag für die Id- und UserName-Eigenschaften. – Scott

+0

(Forts.) Das generische TUser-Objekt, das UserManager akzeptiert, muss IUser implementieren. Daher wird Ihr MyUser-Objekt als generischer Objekttyp akzeptiert, aber UserManager verfügt über viele weitere Methoden wie "ChangePasswordAsync (TUser-Benutzer, Zeichenfolgenkennwort)", die davon abhängig sind, dass diese Eigenschaften Teil des generischen Objekts sind. IdentityUser enthält diese Eigenschaften. Wenn Sie IdentityUser als Basisklasse für Ihr MyUser-Objekt verwenden, ersparen Sie sich Zeit, sie selbst zu deklarieren oder die UserManager-Methoden zu überschreiben, damit sie mit Ihren benutzerdefinierten Eigenschaften arbeiten können. – Scott