2015-03-17 10 views
11

Mam problem z umieszczeniem mojej bazy danych z użytkownikami i rolami.Sprawdzanie, czy użytkownik odgrywa rolę w asp.net mvc Identity

Użytkownik i rola są tworzone (widzę je w bazie danych po zgłoszeniu błędu).

Jednak gdy próbuję sprawdzić, czy użytkownik jest w roli, otrzymuję wyjątek.

Mój kod to:

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

Jednak na linii:

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

jest wyjątek z błędem: UserId not found.

użytkownikiem i rolę, są zarówno w bazie danych, gdy sprawdzam po wyrzuceniu wyjątku:

Shows User Added to DB

Shows Role Added to DB

Czy ktoś może zobaczyć, co robię źle?

Dzięki za wszelką pomoc,

Mark

+0

Czy próbowałeś 'SaveChanges()' przed 'if (! UserManager.IsInRole (" marktest "," Admin "))'? – Bruniasty

+0

Hi - tak, dodałem 'context.SaveChanges();' - tuż przed tą linią, ale nadal generuje wyjątek z tym samym błędem. Dzięki, Mark – Mark

+0

Czy użytkownik "marktest" jest zapisany w bazie danych? – Bruniasty

Odpowiedz

23

I okazało się rozwiązanie, w przypadku gdy ktoś inny ma ten problem.

W "IsInRole" spodziewa się User.Id - nie ciąg nazwa_użytkownika - więc zmienione na:

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

Więc kod roboczych staje:

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


    } 

Mam nadzieję, że pomaga,

Mark

+0

Mój kod wygląda tak samo, ale nadal nie mogę znaleźć UserId w tym samym miejscu –

4

Najprostsza rzecz w życiu;

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

Z jakiegoś powodu nie działa to dla mnie! Używam .Net Core z uwierzytelnianiem JWT. – Ciwan

+0

spróbuj użyć @if (Roles.IsUserInRole (Model.UserName, "Administrator")) jeśli to działa –