使用 ASP.NET Core 身份,我使用 UserManager.CreateAsync()
创建了一个新用户并使用 UserManager.AddToRoleAsync
将它们分配给现有角色.这是可行的,因为用户和角色之间的关系存储在 AspNetUserRoles
中。数据库的表。
但是当我使用 UserManager 获取用户时(例如 UserManager.FindByMail()
方法)然后 Role
列表为空。我也试过Include
EF的功能如下:
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 没有更好的方法来获取这些数据......
最佳答案
UserManager 默认不加载关系。
手动包含是一个好方法,但如 here 所述- EntityFramework Core 尚不支持直接 M:N 关系。
所以我看到有两种方式:
(首选)使用
userManager.GetRolesAsync(user);
这将返回
List<string>
带有用户的角色名称。或者使用一些 EF 查询来获得 IdentityRole
通过加入 IdentityUserRole 的对象。不幸的是,这需要接受角色不会直接在用户实体中的事实。或者您可以实现自定义
IdentityUserRole
,创建与 IdentityRole
的关系那里然后用`查询它Include(user => user.Roles).ThenInclude(role => role.Role)
描述了如何实现自己的身份实体,例如here .但它的方法很复杂,
Role
对象将嵌套在绑定(bind)实体中。但是,您可以在
ApplicationUser
中声明属性。 :[NotMapped]
public List<string> RoleNames {get; set;}
并随意使用它...
关于asp.net-core - 获取分配角色的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39946711/