Ich bin gerade dabei, eine neue Anwendung zu erstellen, und habe mit EF6-rc1, Microsoft.AspNet.Identity.Core 1.0.0-rc1, Microsoft.AspNet.Identity.EntityFramework 1.0.0-rc1, Microsoft.AspNet.Identity begonnen .Owin 1.0.0-rc1 usw. und mit den gestrigen RTM-Releases habe ich sie heute Abend über NuGet auf RTM aktualisiert.
Abgesehen von ein paar Codeänderungen an der Arbeit, die ich bisher geleistet hatte, schien alles gut zu laufen, bis ich versuchte, ein lokales Benutzerkonto für die App zu erstellen.
Ich habe daran gearbeitet, dass E-Mail-Adressen das Benutzernamenformat sind, das mit dem Release Candidate hervorragend funktioniert hat. Beim Erstellen eines Benutzers mit einer E-Mail-Adresse für einen Benutzernamen wird jedoch der folgende Validierungsfehler ausgegeben:
Der Benutzername [email protected] ist ungültig und darf nur Buchstaben oder Ziffern enthalten.
Ich habe die letzte Stunde damit verbracht, nach einer Lösung oder Dokumentation zu Konfigurationsoptionen zu suchen, aber ohne Erfolg.
Gibt es eine Möglichkeit, es so zu konfigurieren, dass E-Mail-Adressen für Benutzernamen zugelassen werden?
quelle
((UserValidator<ApplicationUser>) UserManager.UserValidator).AllowOnlyAlphanumericUserNames = false;
Antworten:
Sie können dies zulassen, indem Sie Ihren eigenen UserValidator in den UserManager einstecken oder ihn einfach in der Standardimplementierung deaktivieren:
quelle
public AccountController(UserManager<ApplicationUser> userManager)
KonstruktorUserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false };
Die C # -Version davon (in App_Code \ IdentityModels.cs) ist
quelle
In meinem Fall bestand die Lösung in VS 2013 C #, MVC 5.2.2, unter Verwendung von ASP.NET Identity 2.0 darin, den ApplicationUserManager-Konstruktor in App_Start \ IdentityConfig.cs wie folgt zu aktualisieren:
quelle
Ich hatte das gleiche Problem, als ich versuchte, den Code zu ändern, damit der Benutzername der tatsächliche Name der Person und nicht die E-Mail war. Das System zeigt mir die gleiche Fehlermeldung "Benutzername ABC DEF ist ungültig, kann nur Buchstaben oder Ziffern enthalten . " Ich habe das Problem gelöst, indem ich das Leerzeichen (in meinem Fall am Ende) zu AllowedUserNameCharacters hinzugefügt habe.
Ich benutze Asp.Net Core 2.2 und VS2017
Das ist mein Code
Gehen Sie zu Startup.cs und bearbeiten oder fügen Sie die Zeile unter "// Benutzereinstellungen" hinzu:
quelle
Wenn Sie ASP.Net-Webformulare verwenden und dies versuchen, öffnen Sie einfach Ihre Datei IdentityModels.vb / cs und lassen Sie sie unter Public Class UserManager folgendermaßen aussehen:
quelle
Für Benutzer von AspNet.Identity.Core 2.1 und höher sind diese Validatoren im UserManager schreibgeschützt. E-Mail-Adressen als Benutzernamen sind standardmäßig zulässig. Wenn Sie jedoch die Zeichen in Ihren Benutzernamen weiter anpassen müssen, können Sie dies in Startup.cs wie folgt tun:
(Ich brauchte ein '/' aus alten Gründen.)
quelle
Da das Codieren meiner eigenen ApplicationUserManager: UserManager-Klasse für mich nicht funktioniert hat (möglicherweise weil ich Razor Pages und nicht MVC verwende), können Sie in Startup.cs in CofigureServices () beispielsweise Identitätsoptionen konfigurieren:
Weitere Informationen zu diesem Thema finden Sie in den Microsoft-Dokumenten: https://docs.microsoft.com/de-de/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-2.2
quelle
Wenn Sie IdentityConfig.cs nicht finden können, ersetzen Sie Ihren AccountController-Konstruktor durch diesen Code.
quelle
In meinem Fall hatte ich eine Repository-Klasse, die mit Authentifizierung arbeitete, sodass ich in Benutzernamen kein "-" verwenden konnte. Der Fix befand sich hier im Konstruktor:
quelle
Ich war auch damit beschäftigt, weil Benutzernamen heutzutage meistens E-Mails sind. Ich kann jedoch die Gründe für ein separates E-Mail-Feld verstehen. Dies sind nur meine Gedanken / Erfahrungen, da ich auch nicht das Wort von Microsoft dazu finden konnte.
Denken Sie daran, Asp Identity dient lediglich dazu, jemanden zu identifizieren. Sie müssen keine E-Mail haben, um identifiziert zu werden, aber wir können sie speichern, da sie Teil einer Identität ist. Wenn Sie in Visual Studio ein neues Webprojekt erstellen, erhalten Sie die Option für Authentifizierungsoptionen.
Wenn Sie einen nicht leeren Projekttyp wie MVC auswählen und die Authentifizierung auf "Einzelkonten" setzen, erhalten Sie die grundlegenden Grundlagen für die Benutzerverwaltung. Eine davon enthält eine Unterklasse, die in App_Start \ IdentityConfig.cs wie folgt aussieht:
Dies sagt uns, dass Microsoft beabsichtigt, komplexere Benutzernamen zu speichern (siehe AllowOnlyAlphaNumericUserNames = false), sodass wir wirklich gemischte Signale haben.
Die Tatsache, dass dies aus einem Standard-Webprojekt generiert wird, gibt uns einen guten Hinweis / eine gute Anleitung von Microsoft (und einen sauberen Weg), damit wir E-Mails für das Feld Benutzername eingeben können. Es ist sauber, da die statische Erstellungsmethode in App_Start \ Startup.Auth.cs verwendet wird, wenn die Anwendung mit dem Microsoft.OWIN-Kontext gebootet wird.
Der einzige Nachteil dieses Ansatzes ist, dass Sie die E-Mail am Ende zweimal speichern ... Was nicht gut ist!
quelle
Wie Sie wahrscheinlich herausgefunden haben (und zu erwarten waren), fügt ASP.NET Identity 2.0.0, veröffentlicht im März 2014, diese Funktionalität dem Framework hinzu.
Ankündigung: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx
Vollständiges Beispiel und Tutorial, einschließlich Kontobestätigung: http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity
quelle
Wenn Sie in Ihrem Account Controller eine Art IOC verwenden (ich verwende StructureMap), müssen Sie den oben von Hao Kung erwähnten Fix anwenden, wenn der Usermanager übergeben wird: (Ich musste). Es kann eine Möglichkeit geben, dies im IOC-Setup zu tun, aber ich weiß nicht wie.
quelle
Ich habe das gleiche Problem konfrontiert. Aber schließlich habe ich das Problem gelöst, indem ich meiner Methode einen Teil hinzugefügt habe, nicht den Konstruktor.
quelle