获取在asp.net identity 2.0中具有指定角色的用户列表

获取在asp.net identity 2.0中具有指定角色的用户列表,asp.net,asp.net-mvc,asp.net-mvc-4,asp.net-identity,asp.net-identity-2,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Identity,Asp.net Identity 2,我有一个下拉列表框,其中列出了角色。我想获得具有该角色的用户列表。我指的是“管理员”角色或“CanEdit”角色的用户列表。这是我的密码: public IQueryable<Microsoft.AspNet.Identity.EntityFramework.IdentityUser> GetRolesToUsers([Control] string ddlRole) { //ddlRole returns role Id, based on this Id I w

我有一个下拉列表框,其中列出了角色。我想获得具有该角色的用户列表。我指的是“管理员”角色或“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;
}
公共IQueryable
GetRolesToUsers([Control]字符串角色)
{    
//ddlRole返回角色Id,根据此Id我要列出用户
var_db=新的应用程序dbContext();
IQueryable查询=_db.Users;
if(ddlRole!=null)
{
//query=query.Where(e=>e.Claims==ddlRole.Value)???????
}
返回查询;
}
请帮忙

更新代码(仍然错误)

公共列表GetRolesToUsers([Control]字符串角色)
{
变量角色管理器=
新角色管理器(新角色存储库(新应用程序上下文());
var users=rolemager.FindByName(“管理员”).users.ToList();
返回用户;
}
错误:当ItemType设置为“Microsoft.AspNet.Identity.EntityFramework.IdentityYUser”时,Select方法必须返回“IQueryable”或“IEnumerable”或“Microsoft.AspNet.Identity.EntityFramework.IdentityYUser”之一

我试过各种铸件,但都没用

更新(工作解决方案)

多亏了克里斯544,他的想法帮助我解决了这个问题。以下是工作方法:-

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;
}
公共列表GetRolesToUsers([Control]字符串角色)
{
var context=new ApplicationDbContext();
变量用户=
context.Users.Where(x=>x.Roles.Select(y=>y.RoleId).Contains(ddlRole)).ToList();
返回用户;
}
不是专家,但

这个in-Identity似乎没有内置的函数性,我也无法从内置角色中获得它(它似乎不适用于基于声明的Identity)

所以我最后做了这样的事情:

var users = context.Users        
    .Where(x => x.Roles.Select(y => y.Id).Contains(roleId))
    .ToList();
  • x.Roles.Select(y=>y.Id)
    获取用户x的所有角色Id的列表
  • .Contains(roleId)
    检查此ID列表是否包含必需的
    roleId

如果要避免直接使用上下文,可以将角色管理器与以下代码片段一起使用

roleManager.FindByName("Administrator").Users


有关此主题的简短讨论,请查看使用角色管理器为您提供的解决方案:

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

我很想知道这比这里的其他解决方案好还是坏。

有三种方法可以做到这一点

在控制器中,可以按如下方式检查当前登录用户的角色:

  if(User.IsInRole("SysAdmin"))
        {
在控制器外部,您可以检查特定用户是否属于以下角色:

 ApplicationUserManager UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var roles = UserManager.GetRoles(userid);
        if (roles.Contains("SysAdmin"))
        {
        }
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
        }
出于集成测试等原因,您可能直接希望使用EF查找用户角色,如下所示:

 ApplicationUserManager UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var roles = UserManager.GetRoles(userid);
        if (roles.Contains("SysAdmin"))
        {
        }
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
@调试模式

我通过角色名称输入找到角色。之后,我按角色的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;
}
公共列表GetUsersInRole(字符串roleName)
{
变量角色管理器=
新角色管理器(新角色存储库(新应用程序上下文());
var role=rolemager.FindByName(roleName.Users.First();
var usersInRole=
其中(u=>u.Roles.Select(r=>r.RoleId).Contains(role.RoleId)).ToList();
返回usersInRole;
}

删除
.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);
        }      
}

为我工作的代码如下:

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

由于这样的比特往往会影响性能,所以我尝试了这里发布的其他答案,并查看了它们生成的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));
        }
    }

    ...
}

尝试Roles.GetUsersInRole(),您可以获得使用默认角色提供程序API@Larry您的意思是[string[]u=Roles.GetUsersInRole(ddlRole)]或[\u roleManager.Roles.GetUsersInRole(ddlRole)]。第一个生成“角色管理器功能尚未启用”错误,第二个生成“GetUserInRole”没有定义。我应该如何使用Roles.GetUsersInRole()?您正在使用asp.net mvc 5吗?我现在在做4号。转到任何操作方法并键入“角色”,它位于“System.Web.Security”命名空间中。我使用的是ASP.NET 4.5和ASP.NET Identity 2.0 Hanks Horizon_NET..看起来我非常接近解决方案。请检查我更新的代码,它会产生错误。这会返回一组
IdentityUserRole
s,而不是
ApplicationUser
s。Identity 1.0中没有内置的功能,但我在web上的某个地方看到了它。感谢chris544,您的想法帮助我解决了这个问题。我更新了这个问题,我相信它会帮助很多开发人员。我花了一个小时左右的时间寻找一个简单的实现。终于找到了。谢谢如果角色的
Id
未知,则应使用
rolemanger
first.y.Id应为y.roleid的实例。唯一的更改是将上述内容包装在If语句中,以检查角色是否存在。如果(roleManager.RoleExists(“CanEdit”)+1转到roleManager(例如角色表)是比最终生成大量SQL的大量LINQ查询更好的快捷方式。回答Trieu很好。在我看来,它提供了可重用的代码。简短、简洁且完全有效!我发现@Trieu Doan在我的例子中并不正确,有效的代码如下:`var users=rolemanger.FindByName(roleName).users.Select(x=>x.UserId);var usersInRole=Users.Where(u=>Users.Contains(u.Id))`
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));
        }
    }

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