ASP.NET标识:获取角色中的所有用户

72qzrwbm  于 2024-01-09  发布在  .NET
关注(0)|答案(8)|浏览(162)

如何获得一个角色中所有用户的列表?以前可以用Roles.GetUsersInRole,但是用新的Identity我找不到这样的东西。

vfh0ocws

vfh0ocws1#

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

fkvaft9z

fkvaft9z2#

你可以使用Entity Framework,但是使用ASP.NET Identity 1.0还不可能。你必须等待Identity 2.0的发布。

  1. using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString)) {
  2. string queryString = "SELECT AspNetUsers.UserName FROM dbo.AspNetUsers INNER JOIN dbo.AspNetUserRoles ON " + "AspNetUsers.Id=AspNetUserRoles.UserId WHERE AspNetUserRoles.RoleID='" + id + "'";
  3. SqlCommand command = new SqlCommand(queryString, connection);
  4. command.Connection.Open();
  5. List<string> @out = null;
  6. dynamic reader = command.ExecuteReader();
  7. while (reader.Read()) {
  8. if (@out == null) @out = new List<string>();
  9. @out.Add(reader.GetString(0));
  10. }
  11. return @out;
  12. }

字符串

展开查看全部
k10s72fa

k10s72fa3#

这是新的MVC 5 ASP.NET Identity

  1. var managerRole = TMRoles.GetIdentityRole(TMRoles.Manager);
  2. var managers = managerRole.Users;
  3. public class TMRoles
  4. {
  5. private static RoleManager<IdentityRole> RoleManager =
  6. new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new TMContext()));
  7. public static string Manager { get { return "Manager"; } }
  8. public static IdentityRole GetIdentityRole(string roleName)
  9. {
  10. return RoleManager.FindByName(roleName);
  11. }
  12. }

字符串

展开查看全部
guykilcj

guykilcj4#

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

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

字符串

ogsagwnx

ogsagwnx5#

这应该适用于.net core 5和更高版本。
第一个月

uubf1zoe

uubf1zoe6#

我没有看到一个内置的方式,但它是相当容易实现。我有这个方法在我的应用程序特定的UserManager:

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

字符串
它输出的SQL似乎是合理的:

  1. SELECT
  2. [Extent1].[Id] AS [Id],
  3. [Extent1].[Email] AS [Email],
  4. [Extent1].[EmailConfirmed] AS [EmailConfirmed],
  5. [Extent1].[PasswordHash] AS [PasswordHash],
  6. [Extent1].[SecurityStamp] AS [SecurityStamp],
  7. [Extent1].[PhoneNumber] AS [PhoneNumber],
  8. [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed],
  9. [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled],
  10. [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc],
  11. [Extent1].[LockoutEnabled] AS [LockoutEnabled],
  12. [Extent1].[AccessFailedCount] AS [AccessFailedCount],
  13. [Extent1].[UserName] AS [UserName]
  14. FROM [dbo].[AspNetUsers] AS [Extent1]
  15. WHERE EXISTS (SELECT
  16. 1 AS [C1]
  17. FROM [dbo].[AspNetUserRoles] AS [Extent2]
  18. INNER JOIN [dbo].[AspNetRoles] AS [Extent3] ON [Extent2].[RoleId] = [Extent3].[Id]
  19. WHERE ([Extent1].[Id] = [Extent2].[UserId]) AND ([Extent3].[Name] = @p__linq__0)
  20. )

展开查看全部
gopyfrb3

gopyfrb37#

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

  1. public static IQueryable<User> GetUsersInRole(DbContext db, string roleName)
  2. {
  3. if (db != null && roleName != null)
  4. {
  5. var roles = db.Roles.Where(r => r.Name == roleName);
  6. if (roles.Any())
  7. {
  8. var roleId = roles.First().Id;
  9. return from user in db.Users
  10. where user.Roles.Any(r => r.RoleId == roleId)
  11. select user;
  12. }
  13. }
  14. return null;
  15. }

字符串

展开查看全部
xoshrz7s

xoshrz7s8#

例如,如果您希望用户列表具有角色“User”

  1. var users = await (from user in _dbContext.Users
  2. join userRole in _dbContext.UserRoles
  3. on user.Id equals userRole.UserId
  4. join role in _dbContext.Roles
  5. on userRole.RoleId equals role.Id
  6. where role.Name == "User"
  7. select user)
  8. .ToListAsync();

字符串

相关问题