web-dev-qa-db-fra.com

Asp.Net Identity enregistrer l'utilisateur sans le courrier électronique

Je veux enregistrer l'utilisateur sans email, comme ceci:

var user = new ApplicationUser { UserName = model.Name };
var result = await UserManager.CreateAsync(user);

Mais j'ai eu l'erreur "Email ne peut pas être nul ou vide". Existe-t-il une solution à ça? Ou c'est impossible?

22
Hagakurje

L'identité dépend du courrier électronique en tant que moyen de réinitialiser le mot de passe de l'utilisateur. 

Cependant, ignorer les courriels n'est pas simple, mais possible. Vous devrez implémenter une interface Microsoft.AspNet.Identity.IIdentityValidator qui ignore le manque de courrier électronique:

namespace Microsoft.AspNet.Identity
{
  /// <summary>
  /// Used to validate an item
  /// 
  /// </summary>
  /// <typeparam name="T"/>
  public interface IIdentityValidator<in T>
  {
    /// <summary>
    /// Validate the item
    /// 
    /// </summary>
    /// <param name="item"/>
    /// <returns/>
    Task<IdentityResult> ValidateAsync(T item);
  }
}

Et ensuite, dans ApplicationUserManager, affectez votre propre implémentation à la propriété UserValidator.

Si vous en avez vraiment besoin, vous pouvez obtenir le code source original pour UserValidator en décompilant la classe Microsoft.AspNet.Identity.UserValidator, en jetant un coup d'oeil dans le code source existant et en supprimant les commentaires négatifs pour le courrier électronique. 

Cependant, je ne suis pas sûr de savoir comment le reste du cadre réagira en cas de manque de courrier électronique sur l'utilisateur. Vous obtiendrez probablement des exceptions dans d'autres opérations.

7
trailmax

Je sais que c'est vieux, mais je ne suis pas d'accord avec la réponse acceptée, car la question porte la mention asp.net-identity-2. Pour le bénéfice des futurs lecteurs, ASP.NET Identity 2.0 offre une solution très simple à ce problème:

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    ...snip...
    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            // This disables the validation check on email addresses
            RequireUniqueEmail = false
        };
        ...snip...
    }
}

Dans UserValidator<TUser>, l'implémentation Task<IdentityResult> ValidateAsync(T item) vérifie cet indicateur et détermine si elle doit exécuter la validation du courrier électronique:

if (this.RequireUniqueEmail)
{
    await this.ValidateEmail(item, list);
}

Puisque vous voulez enregistrer les utilisateurs sans adresse électronique, procédez comme suit.

CAUTION: Ceci ne devrait être utilisé que lorsque les adresses email ne sont pas collectées. Si vous souhaitez collecter et valider des adresses e-mail, mais les rendre facultatives lors de votre inscription, vous devez utiliser une variable IIdentityValidator personnalisée.

75
yfisaqt

ASP Identity 2.2 peut être défini dans App_Start\IdentityConfig.cs

    manager.UserValidator = new UserValidator<ApplicationUser>(manager)
    {
        AllowOnlyAlphanumericUserNames = false,
        RequireUniqueEmail = false
    };
28
Rudy

En fait, il existe un meilleur moyen. Modifiez la validation juste au moment où vous devez l’ignorer, puis restaurez-la lorsque vous avez terminé. (N'utilisez pas async dans ce cas car un autre thread pourrait avoir besoin de mettre à jour (?)) 

// first create/update the identity!!! 
user.PasswordHash = UserManager.PasswordHasher.HashPassword(model.Password); //hash and update directly

// alter
UserManager.UserValidator = new UserValidator<StoreUser>(UserManager)
{
    AllowOnlyAlphanumericUserNames = false,
    RequireUniqueEmail = false
};

var result = UserManager.Update(user);

// restore... 
UserManager.UserValidator = new UserValidator<StoreUser>(UserManager)
{
    AllowOnlyAlphanumericUserNames = false,
    RequireUniqueEmail = true
};
0
Jeff