【问题标题】:ASP.NET Identity: get all users in a roleASP.NET Identity:获取角色中的所有用户
【发布时间】:2013-10-29 16:49:47
【问题描述】:

如何获取一个角色中所有用户的列表?在使用 Roles.GetUsersInRole 之前,但使用新身份时,我找不到这样的东西。

【问题讨论】:

  • 发现角色的成员可能会非常昂贵,包括重复远程查询实际上支持您接受的身份的任何数据存储 - 即使这些存储支持 i> 这样的查询。试着把事情颠倒过来——为什么你需要知道这个角色的所有成员? (请记住,一旦您的系统有这些信息,它可能已经过时了)
  • @Damien_The_Unbeliever:我需要将应用程序从旧成员身份迁移到新身份。例如,我需要一个具有管理员角色的用户列表,以便向所有用户发送电子邮件。现在我试图想象一个数据库查询,看起来它是一个内部连接的简单查询。也许我错过了很多,但我不明白为什么这非常昂贵。所以,我总是可以通过数据库上下文来做到这一点,但只是想知道为什么框架不提供这个功能。
  • 我说它可能很昂贵 - 并非所有使用身份系统的场景都将角色存储在 SQL 数据库中。

标签: c# asp.net asp.net-mvc-5 asp.net-identity


【解决方案1】:

它不可能通过 1.0 RTM 中的 RoleManager,在 1.1 中它将通过 IQueryable RoleManager.Roles 公开。对于 1.0,您需要下拉到实现层(即 db 上下文)

【讨论】:

  • 你能解释一下吗?给我们一些代码或例子。谢谢
【解决方案2】:

您可以使用实体框架,但还不能使用 Asp.Net Identity 1.0。您必须等待 Identity 2.0 的发布。

using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString)) {
    string queryString = "SELECT AspNetUsers.UserName FROM dbo.AspNetUsers INNER JOIN dbo.AspNetUserRoles ON " + "AspNetUsers.Id=AspNetUserRoles.UserId WHERE AspNetUserRoles.RoleID='" + id + "'";
    SqlCommand command = new SqlCommand(queryString, connection);
    command.Connection.Open();

    List<string> @out = null;
    dynamic reader = command.ExecuteReader();
    while (reader.Read()) {
        if (@out == null) @out = new List<string>();
        @out.Add(reader.GetString(0));
    }

    return @out;
}

【讨论】:

  • 最好使用Entity Framework 和Identity 然后下拉到SqlConnections 和SqlCommands。海事组织
【解决方案3】:

我没有看到内置的方法,但它很容易实现。我在特定于应用程序的 UserManager 中有这个方法:

public IQueryable<User> GetUsersInRole(string roleName)
{
    return from user in Users
           where user.Roles.Any(r => r.Role.Name == roleName)
           select user;
}

它输出的 SQL 似乎是合理的:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Email] AS [Email], 
[Extent1].[EmailConfirmed] AS [EmailConfirmed], 
[Extent1].[PasswordHash] AS [PasswordHash], 
[Extent1].[SecurityStamp] AS [SecurityStamp], 
[Extent1].[PhoneNumber] AS [PhoneNumber], 
[Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
[Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
[Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
[Extent1].[LockoutEnabled] AS [LockoutEnabled], 
[Extent1].[AccessFailedCount] AS [AccessFailedCount], 
[Extent1].[UserName] AS [UserName]
FROM [dbo].[AspNetUsers] AS [Extent1]
WHERE  EXISTS (SELECT 
    1 AS [C1]
    FROM  [dbo].[AspNetUserRoles] AS [Extent2]
    INNER JOIN [dbo].[AspNetRoles] AS [Extent3] ON [Extent2].[RoleId] = [Extent3].[Id]
    WHERE ([Extent1].[Id] = [Extent2].[UserId]) AND ([Extent3].[Name] = @p__linq__0)
)

【讨论】:

    【解决方案4】:

    这是给新的MVC 5 ASP.NET Identity

    var managerRole = TMRoles.GetIdentityRole(TMRoles.Manager);
    var managers = managerRole.Users;
    
    public class TMRoles
    {
        private static RoleManager<IdentityRole> RoleManager = 
            new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new TMContext()));
    
        public static string Manager { get { return "Manager"; } }
    
    
        public static IdentityRole GetIdentityRole(string roleName)
        {
            return RoleManager.FindByName(roleName);
        }
    }
    

    【讨论】:

      【解决方案5】:

      由于某种原因,@ChoptimusPrime 上面建议的非常好的查询在 ASP.NET Identity 2.2.1 中没有为我编译。我写了一个扩展函数:

      public static IQueryable<User> GetUsersInRole(DbContext db, string roleName)
      {
        if (db != null && roleName != null)
        {
          var roles = db.Roles.Where(r => r.Name == roleName);
          if (roles.Any())
          {
            var roleId = roles.First().Id;
            return from user in db.Users
                   where user.Roles.Any(r => r.RoleId == roleId)
                   select user;
          }
        }
        return null;
      }
      

      【讨论】:

        【解决方案6】:

        让用户担任任何角色的最简单方法

        int totalUser=db.AspNetUsers.Where(u => u.AspNetRoles.Any(r => r.Name == "USER")).Count()
        

        【讨论】:

          【解决方案7】:

          例如,如果您想要角色为“用户”的用户列表

          var users = await (from user in _dbContext.Users
                                           join userRole in _dbContext.UserRoles
                                           on user.Id equals userRole.UserId
                                           join role in _dbContext.Roles 
                                           on userRole.RoleId equals role.Id
                                           where role.Name == "User" 
                                           select user)
                                           .ToListAsync();
          

          【讨论】:

            猜你喜欢
            • 2014-03-08
            • 2015-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-05
            • 1970-01-01
            • 2023-03-21
            相关资源
            最近更新 更多