2016-05-03 4 views
0

Ich verwende das ASP.NET Identity-Framework mit dem EntityFramework-Provider (IdentityDbContext).Erstellen eines Benutzers fehlgeschlagen. Gibt es eine Möglichkeit, den Fehler zu interagieren?

Ich versuche, einen Benutzer durch den Aufruf UserManager.CreateAsync(..) zu erstellen.

Es gibt ein Objekt vom Typ IdentityResult, mit den folgenden Werten:

{ 
    Succeeded: false, 
    Errors: ["Name AndrewShepherd is already taken."] 
} 

Der Fehler ist gültig - es ist in der Tat ein anderer Benutzer „AndrewShepherd“ in der Datenbank genannt. Dies ist kein Name, den der Benutzer ausgewählt hat. Stattdessen erstelle ich diesen Namen aus den Outh2-Kontoinformationen, die von ihrem Google-Konto bereitgestellt werden. (Google-Konten erzwingen keine eindeutigen Namen, nur eindeutige E-Mail-Adressen).

Da das Problem ein doppelter Name ist, kann ich einfach versuchen, eine Zahl an den Namen anzuhängen und es erneut zu versuchen. Ich würde programmatisch versuchen, AndrewShepherd_1, AndrewShepherd_2, AndrewShepherd_3 zu erstellen, bis ich entweder erfolgreich bin oder einen anderen Fehler erhalte.

Aber wie programmiere ich programmatisch, dass das Problem ein doppelter Name war?

Optionen sind:

  • auf dem Fehler-String ein Muster Spiel durchführen. Diese Lösung wird garantiert beschädigt, wenn die nächste Version von ASP.NET Identity eine anders formulierte Fehlermeldung hat oder wir die Website internationalisieren.

  • Führen Sie den Check aus, bevor Sie den Benutzer erstellen. Ich würde UserStore.FindByNameAsync anrufen, um festzustellen, ob der Name schon vor dem Aufruf UserManager.CreateASync(..) aufgerufen wurde. Dies hätte ein geringes Nebenläufigkeitsrisiko, wenn zwei verschiedene Sitzungen versuchen, denselben Benutzernamen gleichzeitig hinzuzufügen.

Es wäre etwas viel einfacher, wenn wir einfach einen Scheck wie folgen durchführen können:

if(identityResult.Errors.Where(e => e.ErrorCode == IdentityErrors.DuplicateName).Any()) 

Gibt es eine Weise, die ich einen eindeutigen Benutzer-Check durchführen kann dann einen Benutzer hinzufügen, das ist sicher in einem gleichzeitige Umgebung?

+0

Verwenden Sie Entity Framework? – kkakkurt

+0

@kkakkurt - ja ich bin. Danke, ich füge diesen Punkt zu meiner Frage hinzu. –

+0

Sie können dieses Thema [Multitenancy] finden (https://www.scottbrady91.com/ASPNET-Identity/Quick-and-Easy-ASPNET-Identity-Multenancy) von Scott Braddy Hilfreiche ... –

Antwort

0

Als Alternative können Sie überprüfen, ob der Benutzername in Ihrem DB vorhanden ist. Wenn der Benutzername bereits vergeben ist, können Sie den neuen Benutzernamen wie AndrewShepherd_1, AndrewShepherd_2, AndrewShepherd_3 ändern.

using (YourProjectName.Models.DefaultConnection db = new Models.DefaultConnection()) 
     { 
      if (db.AspNetUsers.Select(q => q.UserName).Contains("usernameThatYouWantToCheck")) 
      { 
       /*Your code*/ 
      } 
     } 
Verwandte Themen