Получить список пользователей с назначенными ролями в 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;
}
Ответы
Ответ 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));