.NET Core 2.0 User无角色问题咨询及GitHub公告解读疑惑
你猜的没错,ASP.NET Core Identity从1.x升级到2.0确实做了这个改动——IdentityUser不再直接包含Roles属性了。这是因为官方调整了用户与角色的关联机制:从原来用户类内嵌角色集合的设计,改成了多对多关联的中间表模式(默认通过IdentityUserRole<TKey>这个中间实体来维护用户和角色的关系)。
不需要在自定义的IdentityUser子类里手动添加Roles的getter/setter,反而不建议这么做,否则会和Identity的默认数据结构冲突,导致数据库映射或角色管理的异常。正确的处理方式是:
获取用户角色:使用
UserManager<TUser>提供的GetRolesAsync(TUser user)方法来异步获取用户的角色列表。示例代码如下:// 先通过依赖注入获取UserManager实例 private readonly UserManager<YourCustomUser> _userManager; public async Task<List<string>> GetUserRoles(YourCustomUser user) { var roles = await _userManager.GetRolesAsync(user); return roles.ToList(); }如果需要在用户类中便捷访问角色:可以添加一个只读属性,但不要将其映射到数据库。比如在你的自定义用户类里:
public class YourCustomUser : IdentityUser { // 其他自定义属性... // 只读属性,仅用于内存中临时存储,不要添加EF相关特性 public IList<string> Roles { get; set; } = new List<string>(); }之后在获取用户对象后,通过
UserManager拿到角色列表再赋值给这个属性即可,不要让EF尝试将它映射到数据库字段。迁移旧代码:如果之前的业务代码直接依赖
user.Roles,需要把所有这类调用替换为await _userManager.GetRolesAsync(user)的异步调用(注意遵循异步方法的使用规范,比如方法前加async关键字,返回Task类型)。
另外要确保你的DbContext正确继承了IdentityDbContext<YourCustomUser>,这样EF会自动配置用户、角色、用户角色关联的数据库表结构,不需要手动额外配置中间表。
内容的提问来源于stack exchange,提问作者user6728767

