Identity Manager如何获取具有任何角色的所有用户

时间:2018-02-26 05:40:28

标签: c# asp.net-core asp.net-identity

在我的应用程序中,我有在AspNetUserRoles保存角色/角色的用户和根本没有角色的用户。我想让所有用户"谁有任何角色"。所以,我试图将所有记录保存在AspNetUserRoles表中,但我找不到任何方法来做到这一点。此外,我不想获取所有用户,然后检查他们是否分配了任何角色,因为这会导致性能下降。 (只有1%的用户有角色。)那么,有什么方法吗?我正在使用.Net Core 2.0。 代码如下:

using Microsoft.AspNetCore.Identity;
using System;
using System.Linq;

namespace GebzeShared.Modules.GUI.Admin.Workflow
{
    public class MyClassWorkflow : IMyClassContract
    {
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly RoleManager<IdentityRole> _roleManager;

        public MyClassWorkflow(
            UserManager<ApplicationUser> userManager,
            RoleManager<IdentityRole> roleManager
            )
        {
            this._userManager = userManager;
            this._roleManager = roleManager;
        }

        public dynamic GetUserRoleList(ClaimsPrincipal user)
        {
            try
            {
                var currentUser = this._userManager.FindByEmailAsync(user.Identity.Name).GetAwaiter().GetResult();
                var user2 = this._personnelRepository.Table.FirstOrDefault(x => x.Email == user.Identity.Name);
                var userRoleList = this._userManager.Users.Where(x => this._userManager.IsInRoleAsync(currentUser, "anyrole")); //dont want to use this
                {
                    RoleName = role.Name
                }).ToList<dynamic>();

                return new
                {
                    RoleList = roleList,
                };
            }
            catch (Exception exp)
            {
                return "Error";
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

而不是查询UserManager只查询User对象上的角色集。

userManager.Users.Where(u => u.Roles.Any(r => r.RoleName == "anyrole"));

答案 1 :(得分:0)

您可以执行以下操作(您需要注入userMangerroleManager):

List<ApplicationUser> usersInRole = new List<ApplicationUser>();
foreach (var role in roleManager.Roles)
{
    usersInRole.AddRange(await userManager.GetUsersInRoleAsync(role.Name));
}