Votre approche de l'utilisation de l'adresse e-mail comme nom d'utilisateur fonctionne bien pour moi. Mais tu as raison; il devient désordonné lorsque l'adresse e-mail est modifiée. L'approche que nous avons adoptée était lorsque l'utilisateur souhaite changer son adresse e-mail, nous changeons également son nom d'utilisateur. La seule façon de le faire était de manipuler directement la base de données. Nous avons pris soin de nous assurer que toute référence à l'utilisateur était faite via l'UserId; cela a assuré que le changement de nom d'utilisateur n'a rien cassé.
Voici le code que nous avons utilisé, au cas où vous seriez intéressé. Le code est dans une classe persistante qui encapsule la classe MembershipUser et est stockée en tant que relation un-à-un. Ignorez simplement la construction de chaîne SQL maléfique et faites quelque chose de mieux;)
IDbCommand cmd = connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = string.Format(
"UPDATE dbo.aspnet_Users SET UserName = '{0}', LoweredUserName = '{0}' WHERE UserId = '{1}'",
DatabaseManager.SqlEscape(value.ToLower()), this.Id);
cmd.ExecuteNonQuery();
cmd = connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = string.Format(
"UPDATE dbo.aspnet_Membership SET Email = '{0}', LoweredEmail = '{0}' WHERE UserId = '{1}'",
DatabaseManager.SqlEscape(value.ToLower()), this.Id);
cmd.ExecuteNonQuery();