2014-09-06 4 views
8

Ich arbeite mit Microsoft Asp.Net Identity Framework Version 2 und implementiere meinen eigenen IUserStore. Meine neue Klasse MyUserStore implementiert die IUserStore<MyUserClass,int> Schnittstelle und die IUserPasswordStore<MyUserClass,int>, die benötigt wird, um es mit der UserManager<MyUserClass,int> Klasse zu verwenden. Oder zumindest das ist, was ich aus der Lektüre Tutorials wie this gesammelt:Wenn Sie Ihren eigenen IUserStore implementieren, sind die "optionalen" Schnittstellen der Klasse tatsächlich optional?

„Die eine erforderliche Schnittstelle in dem Identitätssystem ist IUserStore“ - Scott Allen

Aber das scheint nicht der Fall zu sein wenn ich den Code ausführe.

ich initialisieren meinen Manager:

var uMan= new UserManager<MyUserClass, int>(new MyUserStore()); 
var sMan = new SignInManager<MyUserClass, int>(uMan,authCtxFromOwin); 

Und wenn sMan.PasswordSignIn (...) auf dem SignInManager ausgeführt wird, ganz gleich, was die SignInManager laufen Funktionalität immer im Usermanager, die auf den optionalen Schnittstellen hängen . Hier ist die Quelle für die PasswordSignInAsync Methode aus der SignInManager Klasse:

public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout) 
     { 
      ... 
      if (await UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture()) 
      { 
       return SignInStatus.LockedOut; 
      } 
      if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture()) 
      { 
       return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture(); 
      } 
      ... 
      return SignInStatus.Failure; 
     } 

Es ruft immer UserManager.IsLockedOutAsync(), bevor er versucht, das Kennwort zu überprüfen, so dass, wenn der Speicher nicht die Schnittstelle IUserLockoutStore implementieren, eine Ausnahme wird jedes Mal geworfen, egal was passiert.

Bedeutet dies, dass Sie, um die Standardfunktionen der UserManager- und SignInManager-Klassen zu verwenden, jede I * Store-Schnittstelle implementieren müssen?

Die Problemumgehung besteht darin, dass er von SignInManager erbt und die PasswordSignInAsync-Methode überschreibt. Ist das die übliche Praxis?

Danke!

+0

Mit Blick auf die neueste Version der Quelle auf GitHub, dies festgelegt ist worden (https://github.com/aspnet/Identity/blob/c9d27e27e6dd6c15b4228de6e5de3c1a22c15a6d/src/Microsoft.AspNet.Identity/SignInManager.cs#L94). Natürlich hilft das nicht für die aktuellen Releases, aber wir sollten das in Zukunft sehen. –

Antwort

6

Was ich festgestellt habe, dass Identity-Framework nicht mit "Optionalität" der erforderlichen I * Store konsistent ist. In einigen öffentlichen Methoden wird überprüft, ob der erforderliche Store bereitgestellt wird, an anderen Stellen wird nur die Methode aufgerufen. Ich habe nicht herausgefunden, welche absolut erforderlich sind und welche nicht aufgerufen werden können. Also würde ich mit der Ausnahme-Spur gehen und implementieren, was auch immer die Geschäfte für Ihre Anwendung benötigt werden.

+1

Es sieht so aus, als hätten sie versucht, aus der Membership-Situation herauszukommen, wo Sie eine einzige Schnittstelle mit hundert Methoden implementiert haben, aber nicht erfolgreich - sie teilen alles auf kleinere Schnittstellen auf, aber im Ergebnis haben Sie immer noch eine riesige UserStore-Klasse. – Giedrius

+0

Ich glaube nicht, dass es in MembershipProvider Schnittstellen gab. Die Klasse "UserStore" ist ein eigenes Implementierungsdetail. Sie können viele kleine Klassen haben, wenn Sie die Implementierung selbst durchführen. – trailmax

+1

Du hast recht bezüglich MembershipProvider, es war keine Schnittstelle, aber abstrakte Klasse, im aktuellen Kontext halte ich das nicht für sehr wichtig, da du hier und hier alles implementieren musstest. In Bezug auf UserStore - ich mache es mir selbst so klein wie möglich (nur um SignInManager benutzen zu können), ohne etwas, das ich nicht brauche, und es enthält immer noch 19 Methoden, ich denke, das ist im Moment absolut notwendig. – Giedrius

Verwandte Themen