webentwicklung-frage-antwort-db.com.de

Konfigurieren Sie Microsoft.AspNet.Identity so, dass die E-Mail-Adresse als Benutzername zulässig ist

Ich bin gerade dabei, eine neue Anwendung zu erstellen, und habe EF6-rc1, Microsoft.AspNet.Identity.Core 1.0.0-rc1, Microsoft.AspNet.Identity.EntityFramework 1.0.0-rc1, Microsoft.AspNet.Identity verwendet .Owin 1.0.0-rc1 usw. und mit den RTM Releases gestern habe ich sie heute Abend über NuGet auf RTM aktualisiert.

Abgesehen von ein paar Codeänderungen an der Arbeit, die ich bisher gemacht hatte, schien alles gut zu laufen, bis ich versuchte, ein lokales Benutzerkonto für die App zu erstellen.

Ich hatte an E-Mail-Adressen gearbeitet, die das Format des Benutzernamens waren, was mit dem Veröffentlichungskandidaten großartig funktionierte. Beim Erstellen eines Benutzers mit einer E-Mail-Adresse für einen Benutzernamen tritt der folgende Überprüfungsfehler auf:

User name [email protected] is invalid, can only contain letters or digits.

Ich habe ungefähr die letzte Stunde damit verbracht, nach einer Lösung oder Dokumentation für Konfigurationsoptionen zu suchen, aber ohne Erfolg.

Kann ich es so konfigurieren, dass E-Mail-Adressen für Benutzernamen zugelassen werden?

115
LiamGu

Sie können dies zulassen, indem Sie Ihren eigenen UserValidator an UserManager anschließen oder die Standardimplementierung einfach deaktivieren:

UserManager.UserValidator = new UserValidator<TUser>(UserManager) { AllowOnlyAlphanumericUserNames = false }
156
Hao Kung

Die C # -Version davon (in App_Code\IdentityModels.cs) ist

public UserManager()
        : base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }
15
user2554240

In meinem Fall, der in VS 2013 C #, MVC 5.2.2 mit ASP.NET Identity 2.0 ausgeführt wurde, bestand die Lösung darin, den ApplicationUserManager-Konstruktor in App_Start\IdentityConfig.cs wie folgt zu aktualisieren:

public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
        this.UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }
8
N1njaB0b

Wenn Sie ASP.Net-Webformulare verwenden und dies zu erreichen versuchen, öffnen Sie einfach Ihre IdentityModels.vb/cs-Datei und lassen Sie es unter Public Class UserManager so aussehen:

Public Class UserManager
Inherits UserManager(Of ApplicationUser)

Public Sub New()
    MyBase.New(New UserStore(Of ApplicationUser)(New ApplicationDbContext()))
    Users = store
    UserValidator = New UserValidator(Of ApplicationUser)(Me) With {.AllowOnlyAlphanumericUserNames = False}
End Sub

Public Property Users() As IUserStore(Of ApplicationUser)
    Get
        Return m_Users
    End Get
    Private Set(value As IUserStore(Of ApplicationUser))
        m_Users = value
    End Set
End Property
Private m_Users As IUserStore(Of ApplicationUser)

End Class
4
TyrolMedia

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, zeigte mir das System die gleiche Fehlermeldung "Benutzername ABC DEF ist ungültig, kann nur Buchstaben oder Ziffern enthalten . " Ich habe das Problem behoben, bei dem das Leerzeichen (in meinem Fall am Ende) zu AllowedUserNameCharacters hinzugefügt wurde.

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:

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

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

        services.Configure<IdentityOptions>(options =>
        {
            // Password settings.
            options.Password.RequireDigit = true;
            options.Password.RequireLowercase = true;
            options.Password.RequireNonAlphanumeric = true;
            options.Password.RequireUppercase = true;
            options.Password.RequiredLength = 6;
            options.Password.RequiredUniqueChars = 1;

            // Lockout settings.
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
            options.Lockout.MaxFailedAccessAttempts = 5;
            options.Lockout.AllowedForNewUsers = true;


            // User settings.
            options.User.AllowedUserNameCharacters =
                "ab[email protected]+ ";
            options.User.RequireUniqueEmail = false;
        });

        services.ConfigureApplicationCookie(options =>
1
jcarrillo

Für Benutzer von AspNet.Identity.Core 2.1 und höher sind diese Prüfer im UserManager schreibgeschützt. E-Mail-Adressen als Benutzernamen sind standardmäßig zulässig. Wenn Sie jedoch weitere Anpassungen der Zeichen in Ihren Benutzernamen benötigen, können Sie dies in Startup.cs folgendermaßen tun:

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, IdentityRole>(options => {
        options.User.AllowedUserNameCharacters = "ab[email protected]+/";
    });

    // ... etc
}

(Ich brauchte ein "/" aus alten Gründen.)

1
bsigma1

In meinem Fall hatte ich eine Repository-Klasse, die mit Authentifizierung arbeitete. Ich durfte in Benutzernamen kein "-" verwenden. Das Update befand sich hier im Konstruktor:

//-------------------------------------------------------
public AuthRepository()
//-------------------------------------------------------
{
    _ctx = new AuthContext();
    _userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx));
    _userManager.UserValidator = new UserValidator<IdentityUser>(_userManager)
    {
        AllowOnlyAlphanumericUserNames = false
    };
}
0
Nick Kovalsky

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 in das Framework ein.

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

0
Vincent Sels

Da das Codieren meiner eigenen ApplicationUserManager: UserManager-Klasse bei mir nicht funktioniert hat (möglicherweise verwende ich Razor Pages, nicht MVC), gibt es hier eine andere Lösung: In Startup.cs in CofigureServices () können Sie Identitätsoptionen konfigurieren, zum Beispiel:

services.Configure<IdentityOptions>(options =>
{
  options.User.AllowedUserNameCharacters = 
  "[email protected]";
  options.User.RequireUniqueEmail = true;
});

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

0
Jimmy

Ich habe mich auch damit beschäftigt, weil es heutzutage meistens um E-Mails mit Benutzernamen geht. Ich kann jedoch die Gründe eines separaten E-Mail-Feldes verstehen. Dies sind rein meine Gedanken/Erfahrungen, da ich auch Microsoft nicht dazu finden konnte.

Denken Sie daran, dass Asp Identity nur dazu dient, jemanden zu identifizieren. Sie müssen keine E-Mail-Adresse haben, um identifiziert zu werden. Sie können jedoch gespeichert werden, da sie Teil einer Identität ist. Wenn Sie ein neues Webprojekt in Visual Studio erstellen, erhalten Sie die Option für die Authentifizierungsoptionen.

Wenn Sie einen nicht leeren Projekttyp wie MVC auswählen und die Authentifizierung auf "Einzelaccounts" setzen, erhalten Sie die grundlegenden Grundlagen für die Benutzerverwaltung. Eine davon enthält eine Unterklasse, die in App_Start\IdentityConfig.cs folgendermaßen aussieht:

 // Configure the application user manager used in this application. UserManager is defined in ASP.NET Identity and is used by the application.
public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };
    }
    //N.B rest of code removed
}

Dies sagt uns, dass Microsoft beabsichtigt, komplexere Benutzernamen zu speichern (siehe AllowOnlyAlphaNumericUserNames = false), also haben wir wirklich gemischte Signale.

Die Tatsache, dass dies aus einem Standard-Webprojekt generiert wird, gibt uns eine gute Richtung (und eine saubere Methode) von Microsoft, um E-Mails für das Feld "Benutzername" eingeben zu können. Es ist sauber, da die statische create-Methode in App_Start\Startup.Auth.cs beim Bootstrapping der Anwendung mit dem Microsoft.OWIN-Kontext verwendet wird.

Der einzige Nachteil dieses Ansatzes besteht darin, die E-Mail zweimal zu speichern. Was nicht gut ist!

0
Nabster

Wenn Sie IdentityConfig.cs nicht finden können, ersetzen Sie Ihren AccountController-Konstruktor durch diesen Code.

public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) 
  {
      AllowOnlyAlphanumericUserNames = false  
  };
}
0

Wenn Sie IOC in Ihrem Account Controller verwenden (ich verwende StructureMap), müssen Sie den oben genannten Fix von Hao Kung anwenden, wenn der Usermanager übergeben wird: ( Ich musste). Möglicherweise gibt es eine Möglichkeit, dies im Setup von IOC zu tun, aber ich weiß nicht wie. 

public AccountController(ApplicationUserManager userManager)
    {
        _userManager = userManager;
        _userManager.UserValidator = new UserValidator<ApplicationUser>(_userManager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };
0
davaus

Ich habe das gleiche Problem konfrontiert. Aber schließlich habe ich das Problem behoben, indem ich der Methode einen weiteren Teil hinzugefügt habe, nicht den Konstruktor.

public void MyMethod(){

     UserManager<ApplicationUser> manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));


                    // Configure validation logic for usernames  
                    manager.UserValidator = new UserValidator<ApplicationUser>(manager)
                    {
                        AllowOnlyAlphanumericUserNames = false,
                        RequireUniqueEmail = true

                    };         

}
0
sachith walpita