ASP.NET Identity 2.0 UserManager.FindByIdAsyc未返回角色

时间:2014-10-30 01:05:58

标签: asp.net asp.net-mvc entity-framework asp.net-identity roles

我正在使用ASP.NET MVC v5.2,Entity Framework v6.0(Code First)和Identity 2.0构建网站。

我的UserAdmin控制器中有以下代码:

    // GET: /UserAdmin/Details/5
    public async Task<ActionResult> Details(string id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        var user = await UserManager.FindByIdAsync(id);
        return View(user);
    }

我的问题是,虽然我可以使用UserManager填充用户的角色,但在使用FindByIdAsync方法时,没有获取与该用户关联的角色

以下是IdentityUserRole表中的数据,该表显示分配给两个角色的突出显示的用户: enter image description here

以下是显示与上述用户相同的调试信息,但角色计数为零: enter image description here

为什么不返回此用户的角色?

编辑#1

我没有使用UserManager的默认实现。

我的ApplicationUser扩展了IdentityUser,允许我添加自定义属性。我的ApplicationDbContext扩展了IdentityDbContext。

我在这里使用Fluent API设置Identity的主键:

        modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
        modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
        modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });

1 个答案:

答案 0 :(得分:4)

在展开IdentityDbContextIdentityUser时,您无需为LoginsRolesUserRoles定义关系,因为它们是已经在基类中定义。你需要删除像modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });这样的行。

至于不使用默认UserManager我可以根据您提供的代码看到这种情况。

UserManager的默认实现在其构造函数中将IUserStore<TUser>作为参数。如果您正在使用(或派生自)Microsoft.AspNet.Identity.EntityFramework库中的UserStore<TUser>实现,则角色,声明和登录等内容将包含在对数据库进行的查询中。如果您要创建自己的实现IUserStore<TUser>的类,那么您需要自己包含相关数据。一个例子如下所示。

    public class ApplicationUser : IdentityUser
    {
        //Add your Custom Properties here..
    }

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {

        //Add your Custom Properties here..
    }


    public class ApplicationUserStore : IUserStore<ApplicationUser>
    {
        private readonly ApplicationDbContext _context;

        public ApplicationUserStore(ApplicationDbContext context)
        {
            _context = context;
        }

        public async Task<ApplicationUser> FindByIdAsync(string userName)
        {
            return await _context.Users.Include(x => x.Roles).FirstOrDefaultAsync(n => n.UserName == userName);
        }
    }