ASP.net Identity 2.1 Получите всех пользователей с ролями

Как я могу получить список пользователей, включая имя роли для каждого пользователя? В моем приложении есть таблицы по умолчанию для проекта MVC.

Я могу получить всех пользователей, использующих Identity 2.1, вот так:

Модель

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

Контроллер

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

Прямо сейчас возвращается это:

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

Это правильно, но мне нужно отобразить информацию о пользователе, такую ​​как имя, адрес электронной почты, имя пользователя и т. Д.

Я хотел бы вернуть такой объект json:

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

RoleName находится в таблице AspNetRoles.

UserId и RoleId - это запрос от AspNetUserRoles.

Какие-нибудь подсказки?


person DavidH    schedule 12.11.2014    source источник
comment
DavidH, вы должны предоставить код своего приложения, чтобы получить подходящий ответ.   -  person carlodurso    schedule 12.11.2014


Ответы (1)


UserManager вещи в Identity имеют тенденцию сбивать с толку людей. В конечном счете, пользователи по-прежнему остаются лишь DbSet в вашем контексте, поэтому вы можете использовать свой контекст как запросы для любого другого объекта:

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

ИЗМЕНИТЬ. Забыл, что IdentityUser.Roles ссылается на IdentityUserRole, а не на IdentityRole. Итак, вам нужно сначала получить роль, а затем использовать идентификатор роли для запроса ваших пользователей.

person Chris Pratt    schedule 12.11.2014
comment
Я также рекомендовал бы расширить UserManager, чтобы инкапсулировать этот метод. - person Erik Philips; 12.11.2014
comment
Отличная идея. Если это то, что вы часто используете, определенно расширьте UserManager. - person Chris Pratt; 12.11.2014
comment
Чист Пратт, спасибо. Ваше предложение сработало отлично. Я новичок в ASP.net MVC 5 Глупо думать, что я провел почти весь день в поисках ответа на что-то настолько простое. Еще раз спасибо. - person DavidH; 12.11.2014
comment
Хорошее решение, но мы используем его, чтобы отправлять уведомления администраторам всякий раз, когда публикуется неутвержденный комментарий. Нет лучшего решения с точки зрения производительности? (Без кеширования конечно) - person SepehrM; 05.06.2016