ASP.Net身份,角色中的用户始终为空

ASP.Net identity, Users in role are always empty

我已经在这篇文章之后使用一些自定义属性实现了 ASP.Net 身份 -

http://typecastexception.com/post/2014/06/22/ASPNET-Identity-20-Customizing-Users-and-Roles.aspx

一切正常,除了。我想让用户处于特定角色(例如,让我获得管理员角色下的所有用户)。

我尝试了以下方法来检索用户 -

            var userRole = _roleManager.Roles.SingleOrDefault(m => m.Name == role.Name);
            var usersInRole = _userManager.Users.Where(m => m.Roles.Any(r => r.RoleId == userRole.Id));
            var usersInRole2 = _userService.GetUsers().Where(u => u.Roles.Any(r => r.RoleId == userRole.Id));

其中 _roleManager 的类型为 ApplicationRoleManager : RoleManager<ApplicationRole>_userManager 属于 ApplicationUserManager : UserManager<ApplicationUser, string> 类型。

我无法在 _userManager_userService

中的用户下获得角色

PS :_userService 是扩展查询 DbSet<ApplicationUser>.

的 IRepository 的服务

我可以在 table ApplicationUserRoles 中看到正确映射的角色,并且当我这样做时我得到了预期的结果 _userManager.IsInRole(user.Id, "Admin");

这可能出了什么问题?

拉胡尔。

如果您正在使用 Entity Framework,这听起来像是您被延迟加载捕获了(因为角色正在添加到数据库中,而不是在从可查询请求时添加)。

尝试如下操作:

_userManager.Users.Include(x => x.Roles).Where(m => m.Roles.Any(r => r.RoleId == userRole.Id));

我知道问题出在哪里了 -

最初 table ApplicationUserRoles 只有主键定义,没有外键映射(多对多映射)。

我在 OnModelCreating

中添加了这个
modelBuilder.Entity<ApplicationUserRole>().HasKey((ApplicationUserRole r) => new { UserId = r.UserId, RoleId = r.RoleId });

//added these definitions
modelBuilder.Entity<ApplicationUser>().HasMany(p => p.Roles).WithRequired().HasForeignKey(p => p.UserId);
modelBuilder.Entity<ApplicationRole>().HasMany(p => p.Users).WithRequired().HasForeignKey(p => p.RoleId);

这完成了关系,现在我可以在 Roles 下看到 Users,反之亦然。

这在更新数据库时导致了问题,但是我只需要在迁移中做一些更改 -

The object 'PK_Dbo.ApplicationUserRole' is dependent on column 'UserId'. ALTER TABLE DROP COLUMN UserId failed because one or more objects access this column.

我所做的就是转到迁移文件并将这些行移到 DropColumn

上方
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationUser_Id" });
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationRole_Id" });
DropPrimaryKey("dbo.ApplicationUserRole");

这也解决了 update-database 异常。

拉胡尔