获取具有指定角色的用户

时间:2016-10-09 17:54:51

标签: asp.net-core asp.net-identity asp.net-core-mvc asp.net-core-1.0

使用ASP.NET核心身份,我创建了一个UserManager.CreateAsync()的新用户,并将其分配给UserManager.AddToRoleAsync的现有角色。这是有效的,因为用户和角色之间的实现存储在数据库的AspNetUserRoles表中。

但是当我使用UserManager(例如UserManager.FindByMail()方法)获取用户时,Role列表为空。我也尝试过EF的Include函数:

var user = userManager.Users.Include(u => u.Roles).FirstOrDefault(u => u.Email == "test@test.de");

这给了我n:m关联表的ID,因为我需要角色名称,所以它不是很有用。也不可能使用第二个查询加载它们,因为身份用户的Roles属性是只读的。我希望得到一个List<string>角色名称。找不到任何关于此的信息。

对我来说,唯一的解决方法似乎是向我的用户添加一个自定义属性,并用数据填充它们,我使用第二个查询获取数据。但那不是一个好的解决方案。不能相信ASP.NET Core Identity没有更好的方法来获取这些数据......

2 个答案:

答案 0 :(得分:10)

默认情况下,UserManager不会加载关系。

手动收录是一种很好的方式,但如前所述here - EntityFramework Core尚未支持 N N

所以我有两种看法:

(优先的)使用

    userManager.GetRolesAsync(user);

这将返回带有用户角色名称的List<string>。或者使用一些EF查询通过加入IdentityUserRole获取IdentityRole个对象。不幸的是,这要求接受角色不会直接在用户实体中的事实。

或者你可以实现自定义IdentityUserRole,在那里创建与IdentityRole的关系,然后用`

查询它
Include(user => user.Roles).ThenInclude(role => role.Role)

如何描述如何实现自己的身份实体。 here。但它的复杂方法和Role对象将嵌套在绑定实体中。

但是,您可以在ApplicationUser

中声明属性
[NotMapped]
public List<string> RoleNames {get; set;}

并随意使用它......

答案 1 :(得分:1)

这是我提出的解决方案。它可能不是最有效的。希望它可以帮到某人。

public class UserVM
{
    public string Id { get; set; }
    public string UserName { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Roles { get; set; }
}

// Project each element of query into List<UserVM>
var list = (from user in _userManager.Users
            select new UserVM
            {
                Id = user.Id,
                UserName = user.UserName,
                Name = user.Name,
                Email = user.Email
            }).ToList();

list.Select(async user =>
{
    var userEntity = await _userManager.FindByIdAsync(user.Id);
    user.Roles = string.Join("; ", await _userManager.GetRolesAsync(userEntity));
}).ToList();