我有一个列出角色的下拉列表框。我想获得具有该角色的用户列表。我的意思是“管理员”角色或“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;
}
错误:当ItemType设置为“Microsoft.AspNet.Identity.EntityFramework.IdentityUser”时,Select方法必须返回“IQueryable”或“IEnumerable”或“Microsoft.AspNet.Identity.EntityFramework.IdentityUser”之一。
我尝试过各种各样的铸件,但没有一件帮助过。
更新(工作解决方案)
感谢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;
}
答案 0 :(得分:36)
不是专家,但......
在Identity中似乎没有内置的功能,我也无法通过内置的Roles使其工作(它似乎不适用于基于声明的身份)。
所以我最终做了这样的事情:
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)
检查此ID列表是否包含必要的roleId
答案 1 :(得分:12)
我通过角色名称输入找到角色。之后,我通过角色的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;
}
答案 2 :(得分:7)
如果您想避免直接使用上下文,可以将 RoleManager 与以下代码段一起使用
roleManager.FindByName("Administrator").Users
或
roleManager.FindByName("CanEdit").Users
有关此主题的简短讨论,请查看this thread
答案 3 :(得分: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));
}
我很想知道这是否比其他解决方案更好或更差。
答案 4 :(得分:3)
有三种方法可以做到。
在Controller中,当前登录用户的角色可以按如下方式进行检查,
if(User.IsInRole("SysAdmin"))
{
Outside Controller,您可以按如下方式检查特定用户是否属于角色:
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
}
希望它有所帮助。
由于 / DJ @debug_mode
答案 5 :(得分:0)
删除static class Question {
public int foo( String a, char[] c,int b) { return b; }
public int bar( String a, char[] c,Integer b) { return b; }
}
并添加.Email
或添加到UserName
的任何名称。
ASPNetUsers
答案 6 :(得分:0)
为我工作的代码如下:
var users = roleManager.FindByName(roleName).Users.Select(x => x.UserId);
var usersInRole = Users.Where(u => users.Contains(u.Id));
答案 7 :(得分:0)
由于这样的位会影响性能,因此我尝试了此处发布的其他答案,并查看了它们生成的SQL。这似乎是目前获取所有用户电子邮件地址的最有效方法。
public void SendEmailToUsersInRole(string roleName)
{
MailMessage message = new MailMessage();
...
using (var usersDB = new ApplicationDbContext())
{
var roleId =
usersDB.Roles.First(x => x.Name == roleName).Id;
IQueryable<string> emailQuery =
usersDB.Users.Where(x => x.Roles.Any(y => y.RoleId == roleId))
.Select(x => x.Email);
foreach (string email in emailQuery)
{
message.Bcc.Add(new MailAddress(email));
}
}
...
}
它执行的SQL如下所示:
SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name]
FROM [dbo].[AspNetRoles] AS [Extent1]
WHERE N'Reviewer' = [Extent1].[Name]
SELECT
[Extent1].[Email] AS [Email]
FROM [dbo].[AspNetUsers] AS [Extent1]
WHERE EXISTS (SELECT
1 AS [C1]
FROM [dbo].[AspNetUserRoles] AS [Extent2]
WHERE ([Extent1].[Id] = [Extent2].[UserId]) AND ([Extent2].[RoleId] = @p__linq__0)
)
-- p__linq__0: '3' (Type = String, Size = 4000)