获取asp.net identity 2.0中已分配角色的用户列表



我有一个下拉列表框,其中列出了角色。我想获得拥有该角色的用户列表。我指的是处于"Administrator"角色或"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"之一。

当ItemType设置为"Microsoft.AspNet.Identity.EntityFramework.IdentityUser"时,

我试了各种各样的铸件,但都没有帮助。

UPDATE (working solution)

多亏了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;
}

不是专家,但是…

在身份中似乎没有内置的功能,我也无法从内置的角色中获得它(它似乎不能与基于声明的身份一起工作)。

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

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

我通过角色名输入找到角色。之后,我根据角色的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;
}

如果您想避免直接使用上下文,您可以使用RoleManager和下面的代码片段

roleManager.FindByName("Administrator").Users

roleManager.FindByName("CanEdit").Users

关于这个话题的简短讨论可以看看这个线程

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

在Controller中可以查看当前登录用户的角色,如下所示

  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
        }

希望有帮助。

谢谢/dj@debug_mode

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

我很想知道这个方案比其他方案好还是差。

我的代码如下:

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

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

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

相关内容

  • 没有找到相关文章

最新更新