2014-04-14 6 views
7

mio attuale Asp.Net MVC 5 progetto mandati di indirizzi e-mail per NomeUtente. Ora voglio aggiornare ASPnet Identity v1.0 a v2.0 per sfruttare tutte le sue nuove funzionalità (see here).aspnet Identità 2.0 Email e UserName duplicazione

Tuttavia, ASPNet v2.0 Identità aggiunge Email come una colonna separata al utenti tavolo e aggiunge una corrispondente struttura al classe IdentityUser.

Non voglio duplicare UserName in questa nuova colonna Email. Come posso la mappa questa proprietà di Email di IdentityUser per utilizzare la colonna UserName esistente & proprietà? È possibile che ignori questa proprietà Email e salti l'aggiunta della colonna nella tabella Utenti? Qualcuno ha provato questo?

Si prega di condividere.

Aggiornamento

Questo è il limite d'identità 2.0. Non possiamo ignorare la proprietà Email o lasciarla Null. Alcune funzionalità di Identity non funzioneranno. :(

+0

sono in grado di fare questo lavoro implementando la mia classe utente che eredita semplicemente da IUser e implementando UserManger, UserStore. – user210757

+0

@ santhosh puoi per favore guardare questa domanda e inviarmi il suggerimento? – SivaRajini

+0

http://stackoverflow.com/questions/36929767/asp-net-identity-entity-framework-database-first-approach-with-own-table-definti – SivaRajini

risposta

3

Si può provare uno di questi:

  1. Prova a ignorarlo da una preponderante Email proprietà nella classe User e unmapping o utilizzando API fluente

    public class ApplicationUser : IdentityUser 
    { 
        // .... 
    
        [NotMapped] 
        public override string Email { get; set; } 
    } 
    

    o

    .
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        modelBuilder.Entity<ApplicationUser>().Ignore(u => u.Email); 
    } 
    
  2. Quando registri il tuo uso r basta assicurarsi che si popolano Email con il UserName

    public async Task<ActionResult> Register(RegisterViewModel model) 
    { 
        if (ModelState.IsValid) 
        { 
         var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
         // ... 
        } 
    } 
    

Naturalmente, si può sempre ignorare Email colonna se non avete intenzione di usarlo, in quanto permette Null, sarà solo seduto nella tabella AspNetUsers con un gruppo di NULL, non l'approccio migliore, ma ricorda che ignorandolo potresti perdere le nuove funzionalità che ASP.NET Identity 2 potrebbe offrire che potresti voler utilizzare.

NOTA Tuttavia non sono sicuro se l'opzione numero 1 funziona su Email proprietà dal momento che è probabilmente utilizzato in tutto il luogo nel nuovo codice di identità. Vale la pena provare. So che è così che puoi sbarazzarti di altre colonne se non ne hai bisogno. Personalmente mi capita di usare la nuova proprietà/colonna Email quindi non l'ho ancora provata.

Non so se ti aiuta, ma ho pensato di condividerlo per ogni evenienza.

+2

Avevo già provato l'opzione 1 che non funzionava. (InvalidOperationException: la proprietà 'Email' non è una proprietà dichiarata sul tipo 'ApplicationUser'. Verificare che la proprietà non sia stata esplicitamente esclusa dal modello utilizzando il metodo Ignore o l'annotazione dati NotMappedAttribute. Assicurarsi che sia una proprietà primitiva valida .) L'opzione 2 è già mostrata negli esempi (controllare nuget.org/packages/Microsoft.AspNet.Identity.Samples). Preferirei non avere la colonna Email nella tabella Utenti e quindi la domanda! – Santosh

+0

@Santosh Point è che un sacco di codice Identity è fortemente accoppiato con la colonna 'email', quindi rimuoverlo potrebbe rompersi più di quanto non si pensi - certamente non è quello che vuoi dato che stiamo parlando di sicurezza. E siamo onesti, una colonna NULL inutilizzata non sarà mai il collo di bottiglia nel rendimento delle tue app ;-) –

1

Ho lo stesso problema, e il modo in cui ho risolto è stato che l'indirizzo di posta elettronica è stato lo stesso come il nome utente durante la creazione di un utente:

var newUser = new ApplicationUser() 
{ 
    UserName = email, 
    Email = email, 
}; 

Tuttavia, se si tenta di creare un account con un nome utente duplicato, riceverai 2 errori di convalida, uno per il campo del nome utente e uno per l'indirizzo email.

per aggirare questo, permettono indirizzi e-mail di non essere unico (essi saranno ancora unico nel suo genere anche se, come i vostri nomi utente sono unici) modificando il file identityconfig.cs:

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