-1

I'm using Asp net core 3.0, with identity and JWT. I can get all users without problem, but the role always come null or just nothing.

      [Route("ListUsers")]
      [AllowAnonymous]
      public IActionResult ListUsers()
      {
          var users = userManager.Users;          
          return Ok(users);
      }

1 Answers1

0

You can loop all the users and get the roles of each user by :

foreach (var user in _userManager.Users.ToList())
{
    var roles = await _userManager.GetRolesAsync(user);
}

Another solution is creating many to many relationship between users and roles , so that you can include with EF query to get the roles . Base on this solution , below code sample works in asp.net core 3.0 with identity :

ApplicationUser :

foreach (var user in _userManager.Users.ToList())
{
    var roles = await _userManager.GetRolesAsync(user);
}

ApplicationRole :

public class ApplicationRole : IdentityRole
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
}

ApplicationUserRole :

public class ApplicationUserRole : IdentityUserRole<string>
{
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
}

ApplicationDbContext :

public class ApplicationDbContext
 : IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserClaim<string>,
 ApplicationUserRole, IdentityUserLogin<string>,
 IdentityRoleClaim<string>, IdentityUserToken<string>>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<ApplicationUserRole>(userRole =>
        {
            userRole.HasKey(ur => new { ur.UserId, ur.RoleId });

            userRole.HasOne(ur => ur.Role)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();

            userRole.HasOne(ur => ur.User)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });
    }
}

Startup :

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true).AddRoles<ApplicationRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

And get users and roles (UserManager<ApplicationUser>) :

 var Users = _userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).ToList();

Don't forget to change to UserManager<ApplicationUser>/SignInManager<ApplicationUser> in _LoginPartial.cshtml .

Nan Yu
  • 21,285
  • 5
  • 39
  • 110