Подтвердить что ты не робот

Получить список пользователей с назначенными ролями в asp.net identity 2.0

У меня есть раскрывающийся список, в котором перечислены роли. Я хочу получить список пользователей, имеющих эту роль. Я имею в виду список пользователей, которые находятся в роли "Администратор" или "CanEdit". Вот мой код:

public IQueryable<Microsoft.AspNet.Identity.EntityFramework.IdentityUser> 
  GetRolesToUsers([Control] string ddlRole)
{    
  //ddlRole returns role Id, based on this Id I want to list users

  var _db = new ApplicationDbContext();
  IQueryable<Microsoft.AspNet.Identity.EntityFramework.IdentityUser> query = _db.Users;

  if (ddlRole != null)
  {
    //query = query.Where(e => e.Claims == ddlRole.Value);  ???????              
  }

  return query;
}

Пожалуйста, помогите.

Обновленный код (по-прежнему ошибка)

public List<IdentityUserRole> GetRolesToUsers([Control]string ddlRole)
{

  var roleManager = 
   new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
  var users = roleManager.FindByName("Administrator").Users.ToList();
  return users;
}

Ошибка: метод выбора должен возвращать один из "IQueryable" или "IEnumerable" или "Microsoft.AspNet.Identity.EntityFramework.IdentityUser", если ItemType установлен в "Microsoft.AspNet.Identity.EntityFramework.IdentityUser".

Я пробовал различные кастинги, но никто из них не помог.

UPDATE (рабочее решение)

Благодаря chris544, его идея помогла мне исправить это. Вот рабочий метод: -

public List<ApplicationUser> GetRolesToUsers([Control]string ddlRole)
{
  var context = new ApplicationDbContext();
  var users =
    context.Users.Where(x => x.Roles.Select(y => y.RoleId).Contains(ddlRole)).ToList();

  return users;
}
4b9b3361

Ответ 1

Не эксперт, но...

В Identity не было встроенной функциональности, и я тоже не мог заставить ее работать из встроенных ролей (похоже, она не работает с идентификатором Identity).

Итак, я сделал что-то вроде этого:

var users = context.Users        
    .Where(x => x.Roles.Select(y => y.Id).Contains(roleId))
    .ToList();
  • x.Roles.Select(y => y.Id) получает список всех идентификаторов ролей для user x
  • .Contains(roleId) проверяет, содержит ли этот список идентификаторов roleId

Ответ 2

Я нахожу роль по имени роли. После этого, я нахожу список пользователей по id роли.

public List<ApplicationUser> GetUsersInRole(string roleName)
{
 var roleManager = 
  new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new  ApplicationDbContext()));
 var role = roleManager.FindByName(roleName).Users.First();
 var usersInRole = 
  Users.Where(u => u.Roles.Select(r => r.RoleId).Contains(role.RoleId)).ToList();
 return usersInRole;
}

Ответ 3

Если вы не хотите напрямую использовать контекст, вы можете использовать RoleManager со следующим фрагментом

roleManager.FindByName("Administrator").Users

или

roleManager.FindByName("CanEdit").Users

Для краткого обсуждения этой темы просмотрите этот поток

Ответ 4

Использование RoleManager дает вам это решение:

if(roleManager.RoleExists("CanEdit"))
{
    var idsWithPermission = roleManager.FindByName("CanEdit").Users.Select(iur => iur.Id);
    var users = db.Users.Where(u => idsWithPermission.Contains(u.Id));
}

Мне было бы интересно узнать, было ли это лучше или хуже, чем другие решения здесь.

Ответ 5

Есть три способа сделать это.

В Контроллере текущая зарегистрированная роль пользователя может быть проверена следующим образом:

  if(User.IsInRole("SysAdmin"))
        {

Внешний контроллер вы можете проверить, принадлежит ли конкретный пользователь роли:

 ApplicationUserManager UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var roles = UserManager.GetRoles(userid);
        if (roles.Contains("SysAdmin"))
        {
        }

Не забудьте добавить пространство имен,

using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

По некоторым причинам, таким как тестирование интеграции и т.д., вы можете прямо хотеть использовать EF для поиска роли пользователя следующим образом:

string userId = User.Identity.GetUserId();
        ApplicationDbContext db = new ApplicationDbContext();
        var role = (from r in db.Roles where r.Name.Contains("Admin") select r).FirstOrDefault();
        var users = db.Users.Where(x => x.Roles.Select(y => y.RoleId).Contains(role.Id)).ToList();
        if (users.Find(x => x.Id == userId) != null)
        {
            // User is in the Admin Role
        }

Надеюсь, это поможет.

Спасибо /Диджей @debug_mode

Ответ 6

Удалите .Email и добавьте UserName или все, что было добавлено в ASPNetUsers для имени.

private void AddAddminToMail(MailMessage message)
{
    var roles = db.Roles.Include(m => m.Users).Where(m => m.Name == "Admin").First();
    foreach (var user in roles.Users)
        {
            var id = user.UserId;
            var userEmail = db.Users.Find(id).Email;
            message.To.Add(userEmail);
        }      
}

Ответ 7

код для меня был следующим:

  var users = roleManager.FindByName(roleName).Users.Select(x => x.UserId);
  var usersInRole = Users.Where(u => users.Contains(u.Id));