2013-12-09 3 views
5

nelle migrazioni classe di configurazione, v'è il metodo dei semi, e sembra che:ASP.net MVC + ASP.net Identità Semina ruoli e utenti

protected override void Seed(DatabaseContext context) 
     { 
      var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 
      var userManager = new UserManager<User>(new UserStore<User>(context)); 

      if (!roleManager.RoleExists("Administrator")) 
      { 
       roleManager.Create(new IdentityRole("Administrator")); 
      } 

      var user = new User {UserName = "someUserName"}; 


      if (userManager.FindByName("someUserName") == null) 
      { 
       var result = userManager.Create(user, "password"); 

       if (result.Succeeded) 
       { 
        userManager.AddToRole(user.Id, "Administrator"); 
       }  

      } 
      } 

E poi in consolle PM Ho eseguito update-base di dati , e ha seminato correttamente il database, e nella tabella AspNetUserRoles posso vedere che utenteUnità utente e ruolo di amministratore sono connessi.

Ma quando ho messo attribuisco [Authorize(Roles = "Administrator")] sopra regolatore Sono stato reindirizzato a pagina di login, come se il mio utente non fosse in quel ruolo, così ho aggiunto la linea in mio controller:

var x = _userManager.IsInRole(_userManager.FindByName("someUserName").Id, "Administrator"); 

E x è falso. Perché sta succedendo ? E come posso ripararlo? E se questo non è il modo corretto di database di seed, che è?

risposta

7

Prova nel metodo semi

context.Configuration.LazyLoadingEnabled = true; 

Ecco la mia congettura a quello che sta succedendo quando lazy loading è disattivata, la proprietà Ruoli dell'oggetto IdentityUser/ApplicationUser è nullo o vuoto quando l'UserManager o UserStore vi accede perché quella raccolta non è stata caricata manualmente. Il codice procede quindi come nessun ruolo è stato assegnato all'utente quando in realtà quella raccolta non è mai stata caricata.

0

Prova

context.SaveChanges(); 

alla fine del metodo di Seed.