2015-01-12 2 views
20

voglio salvare utente senza e-mail, in questo modo:Asp.Net Identità salvare utente senza email

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

ma ho ottenuto l'errore "E-mail non può essere nullo o vuoto". C'è qualche soluzione per questo? O è impossibile?

risposta

6

L'identità dipende dall'e-mail come metodo per reimpostare la password dell'utente.

Tuttavia, ignorare l'e-mail non è semplice, ma possibile. Avrai bisogno di implementare Microsoft.AspNet.Identity.IIdentityValidator interfaccia che ignora la mancanza di e-mail:

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); 
    } 
} 

E poi nel ApplicationUserManager assegnare una propria implementazione di proprietà UserValidator.

Se davvero bisogno di questo, è possibile ottenere il codice sorgente originale per UserValidator da decompilazione Microsoft.AspNet.Identity.UserValidator classe e sbirciare nel codice sorgente esistente e la rimozione cheecking per la posta elettronica.

Tuttavia, non sono sicuro di come il resto del framework reagirà in caso di mancanza di e-mail dell'utente. Probabilmente otterrai delle eccezioni in altre operazioni.

68

So che questo è vecchio, ma non sono d'accordo con la risposta accettata, poiché la domanda è contrassegnata come asp.net-identity-2. A beneficio dei futuri lettori, ASP.NET 2.0 Identità ha una molto semplice soluzione a questo problema:

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... 
    } 
} 

In UserValidator<TUser>, le Task<IdentityResult> ValidateAsync(T item) controlli di implementazione questo flag e determina se dovrebbe funzionare la convalida e-mail:

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

Dal momento che si desidera salvare utenti senza un indirizzo e-mail, questo è come si dovrebbe fare.

ATTENZIONE: deve essere utilizzato solo quando gli indirizzi di posta elettronica non vengono raccolti. Se si desidera raccogliere e convalidare gli indirizzi e-mail, ma renderli opzionali durante la registrazione, è necessario utilizzare un numero personalizzato IIdentityValidator.

+2

Più uno per il tuo avatar. ... e la risposta corretta alla domanda, ovviamente! :) –

21

ASP Identity 2.2 può essere impostato in App_Start\IdentityConfig.cs

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

In realtà c'è un modo migliore. Alterare la convalida solo quando è necessario ignorarlo e quindi ripristinarlo al termine. (Non utilizzare async in questo caso perché potrebbe essere necessario aggiornare un altro thread (?))

// 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

questa è davvero una pessima idea. Cosa succede se due persone aggiornano il proprio utente allo stesso tempo? [Condizioni di gara] (https://en.wikipedia.org/wiki/Race_condition) ecco cosa. Perché non dovresti impostare questa volta all'avvio come chiunque altro suggerisce? – Liam

+0

Cosa succede se voglio memorizzare la posta elettronica ei suoi campi associati ora trovati in AspNetUsers in una tabella separata? Lo stesso con i campi del telefono? – muybn