Configurez Microsoft.AspNet.Identity pour autoriser l’adresse e-mail en tant que nom d’utilisateur

Je suis en train de créer une nouvelle application et j’ai commencé à utiliser EF6-rc1, Microsoft.AspNet.Identity.Core 1.0.0-rc1, Microsoft.AspNet.Identity.EntityFramework 1.0.0-rc1, Microsoft.AspNet.Identity .Owin 1.0.0-rc1, etc et avec les sorties RTM hier, je les ai mises à jour via NuGet ce soir à RTM.

En dehors de quelques modifications de code apscopes au travail que j’avais effectué jusqu’à présent, tout semblait bien se passer, jusqu’à ce que j’essaie de créer un compte d’utilisateur local pour l’application.

Je travaillais sur des adresses e-mail dont le format de nom d’utilisateur fonctionnait bien avec la version candidate, mais maintenant, lors de la création d’un utilisateur avec une adresse e-mail pour un nom d’utilisateur, l’erreur de validation suivante apparaît:

User name xxxxx@xxxx.com is invalid, can only contain letters or digits. 

J’ai passé la dernière heure à chercher une solution ou une documentation sur les options de configuration, mais en vain.

Est-il possible de le configurer pour autoriser les adresses de messagerie pour les noms d’utilisateur?

Vous pouvez autoriser cela en branchant votre propre UserValidator sur UserManager, ou simplement en l’éteignant sur l’implémentation par défaut:

 UserManager.UserValidator = new UserValidator(UserManager) { AllowOnlyAlphanumericUserNames = false } 

La version C # de ceci (dans App_Code \ IdentityModels.cs) est

 public UserManager() : base(new UserStore(new ApplicationDbContext())) { UserValidator = new UserValidator(this) { AllowOnlyAlphanumericUserNames = false }; } 

Dans mon cas, en cours d’exécution dans VS 2013 C #, MVC 5.2.2, en utilisant ASP.NET Identity 2.0, la solution consistait à mettre à jour le constructeur ApplicationUserManager dans App_Start \ IdentityConfig.cs comme suit:

 public ApplicationUserManager(IUserStore store) : base(store) { this.UserValidator = new UserValidator(this) { AllowOnlyAlphanumericUserNames = false }; } 

Si vous utilisez des formulaires Web ASP.Net et que vous essayez d’y parvenir, ouvrez simplement votre fichier IdentityModels.vb / cs et sous Public Class UserManager, faites-le comme suit:

 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 

Si vous ne trouvez pas IdentityConfig.cs, remplacez votre constructeur AccountController par ce code.

 public AccountController(UserManager userManager) { UserManager = userManager; UserManager.UserValidator = new UserValidator(UserManager) { AllowOnlyAlphanumericUserNames = false }; } 

Dans mon cas, je disposais d’une classe de référentiel fonctionnant avec l’authentification, qui ne me permettait pas d’utiliser un “-” à l’intérieur des noms d’utilisateur. Le correctif se trouvait dans le constructeur ici:

 //------------------------------------------------------- public AuthRepository() //------------------------------------------------------- { _ctx = new AuthContext(); _userManager = new UserManager(new UserStore(_ctx)); _userManager.UserValidator = new UserValidator(_userManager) { AllowOnlyAlphanumericUserNames = false }; } 

J’étais également coincé avec cela parce que la plupart du temps, les noms d’utilisateur sont des courriels de nos jours, je peux comprendre le raisonnement d’un champ de courrier électronique distinct. Ce sont purement mes pensées / mon expérience, car je ne pouvais pas non plus trouver le mot de Microsoft à ce sujet.

Rappelez-vous, Asp Identity est purement pour identifier quelqu’un, vous n’avez pas besoin d’avoir un E-mail pour être identifié, mais ils nous permettent de le stocker car il fait partie d’une identité. Lorsque vous créez un nouveau projet Web dans Visual Studio, vous avez la possibilité d’utiliser les options d’authentification.

Si vous sélectionnez un type de projet non vide tel que MVC et définissez l’authentification sur “Comptes individuels”, vous obtenez les bases de base pour la gestion des utilisateurs. L’une d’elles comprend une sous-classe ressemblant à ceci dans App_Start \ IdentityConfig.cs:

  // 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 { public ApplicationUserManager(IUserStore store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore(context.Get())); // Configure validation logic for usernames manager.UserValidator = new UserValidator(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; } //NB rest of code removed } 

Qu’est-ce que cela nous dit, c’est que Microsoft nous a l’intention de stocker des noms d’utilisateur plus complexes (reportez-vous à AllowOnlyAlphaNumericUserNames = false), donc nous avons vraiment des signaux mixtes.

Le fait que cela soit généré à partir d’un projet web par défaut nous donne une bonne indication / direction de Microsoft (et d’une manière propre) pour nous permettre d’entrer des e-mails pour le champ du nom d’utilisateur. Il est propre car la méthode de création statique est utilisée dans App_Start \ Startup.Auth.cs lors du démarrage de l’application avec le contexte Microsoft.OWIN.

Le seul inconvénient de cette approche est que vous finissez par stocker l’e-mail deux fois … Ce qui n’est pas bon!

Comme vous l’avez probablement découvert (et à prévoir), ASP.NET Identity 2.0.0, publié en mars 2014, ajoute cette fonctionnalité dans la structure.

Annonce: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx

Exemple complet et tutoriel, y compris la confirmation de compte: http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity