Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.net Identity 2.1 Get all users with roles

How can I get a list of users including the role name per user? My app has the default tables of an MVC Project.

I'm able to retrieve all users using Identity 2.1 like this:

Model

public class GetVendorViewModel
{
    public IList<ApplicationUser> Vendors { get; set; }
}

Controller

public ActionResult Index()
        {

            var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
            var roleStore = new RoleStore<IdentityRole>(ac);
            var roleManager = new RoleManager<IdentityRole>(roleStore);
            var vendor = roleManager.FindByName("Vendor").Users;
            var model = new GetVendorViewModel { Vendors = vendor };
            return View("~/Views/User/Administrator/Vendor/Index.cshtml", model);
        }

Right now is returning this:

[
   {
      UserId: "4f9ed316-a852-45a9-93a8-a337a37b1c74",
      RoleId: "a17bb59c-285a-43f9-b5ad-65f46f94bb4f"
   }
]

This is correct but I need to display the user information such as name, email, username etc.

I would like to return a json object like this:

[
  {
    UserId: "4f9ed316-a852-45a9-93a8-a337a37b1c74",
    RoleId: "a17bb59c-285a-43f9-b5ad-65f46f94bb4f"
    RoleName: "Administrator"
    User: {
            name:"Joe Doe",
            email:"[email protected]",
            ...
          }
  },
  {
    ...
  }
]

RoleName is in the table AspNetRoles.

UserId and RoleId its being query from AspNetUserRoles.

Any clues?

like image 820
DavidH Avatar asked Nov 12 '14 18:11

DavidH


1 Answers

The UserManager stuff in Identity tends to confuse people. Ultimately, users are still just a DbSet on your context, so you can use your context like querying for any other object:

var role = db.Roles.SingleOrDefault(m => m.Name == "role");
var usersInRole = db.Users.Where(m => m.Roles.Any(r => r.RoleId == role.Id));

EDIT Forgot that IdentityUser.Roles references IdentityUserRole instead of IdentityRole directly. So you need to get the role first, and then use the role's id to query into your users.

like image 102
Chris Pratt Avatar answered Dec 22 '22 04:12

Chris Pratt