2015-03-17 12 views
11

Sto riscontrando un problema nel seeding del mio database con utenti e ruoli.Controllare se un utente ha un ruolo in asp.net mvc Identity

L'utente e il ruolo vengono entrambi creati (è possibile vederli nel database dopo che è stato generato l'errore).

Tuttavia, quando provo a verificare se l'utente ha un ruolo, ottengo un'eccezione.

Il mio codice è:

public class tbInitializer<T> : DropCreateDatabaseAlways<tbContext> 
    { 
    protected override void Seed(tbContext context) 
    { 
     ApplicationDbContext userscontext = new ApplicationDbContext(); 
     var userStore = new UserStore<ApplicationUser>(userscontext); 
     var userManager = new UserManager<ApplicationUser>(userStore); 

     var roleStore = new RoleStore<IdentityRole>(userscontext); 
     var roleManager = new RoleManager<IdentityRole>(roleStore); 


     if(!userscontext.Users.Any(x=> x.UserName=="marktest")) 
     { 
      var user = new ApplicationUser { UserName = "marktest", Email = "[email protected]" }; 
      userManager.Create(user, "Pa$$W0rD!"); 
     } 

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

     if(!userManager.IsInRole("marktest","Admin")) 
     { 
      userManager.AddToRole("marktest","Admin"); 
     } 

Tuttavia, sulla linea:

if(!userManager.IsInRole("marktest","Admin"))

viene generata un'eccezione con l'errore: UserId not found.

l'utente e il ruolo sono entrambi nel database quando controllo dopo che l'eccezione è stata lanciata:

Shows User Added to DB

Shows Role Added to DB

Chiunque può vedere quello che sto facendo di sbagliato?

Grazie per qualsiasi aiuto,

Mark

+0

Hai provato 'SaveChanges()' prima di 'if (! UserManager.IsInRole (" marktest "," Admin "))'? – Bruniasty

+0

Ciao - sì, ho aggiunto 'context.SaveChanges();' - appena prima di quella riga, ma è ancora lancia un'eccezione con lo stesso errore. Grazie, Mark – Mark

+0

L'utente "marktest" è stato salvato in un database? – Bruniasty

risposta

23

ho trovato la soluzione, nel caso qualcuno altro sta avendo questo problema.

Il "IsInRole" si aspetta un User.Id - non una stringa UserName - così ho cambiato a:

  if (!userManager.IsInRole(user.Id, "Admin")) 
      { 
       userManager.AddToRole(user.Id, "Admin"); 
      } 

Così il codice di lavoro diventa:

ApplicationDbContext userscontext = new ApplicationDbContext(); 
    var userStore = new UserStore<ApplicationUser>(userscontext); 
    var userManager = new UserManager<ApplicationUser>(userStore); 

    var roleStore = new RoleStore<IdentityRole>(userscontext); 
    var roleManager = new RoleManager<IdentityRole>(roleStore); 

    // Create Role 
    if (!roleManager.RoleExists("Admin")) 
    { 
     roleManager.Create(new IdentityRole("Admin")); 
    } 

    if(!userscontext.Users.Any(x=> x.UserName=="marktest")) 
    { 
     // Create User 
     var user = new ApplicationUser { UserName = "marktest", Email = "[email protected]" }; 
     userManager.Create(user, "Pa$$W0rD!"); 

     // Add User To Role 
     if (!userManager.IsInRole(user.Id, "Admin")) 
      { 
       userManager.AddToRole(user.Id, "Admin"); 
      } 


    } 

Mi auguro che aiuta,

Mark

+0

Il mio codice sembra lo stesso, ma ottengo ancora lo UserId non trovato nello stesso posto –

4

La cosa più semplice nella vita;

bool isAdmin= User.IsInRole("admin") 
+0

Per qualche motivo, questo non funziona per me! Sto usando .Net Core con autenticazione JWT. – Ciwan

+0

prova a utilizzare @if (Roles.IsUserInRole (Model.UserName, "Administrator")) se funziona –

Problemi correlati