ASP.net MVC + ASP.net Identity 种子数据 - 角色和用户

5
在迁移配置类中,有Seed方法,其代码如下:

protected override void Seed(DatabaseContext context)
        {
           var  roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
           var  userManager = new UserManager<User>(new UserStore<User>(context)); 

            if (!roleManager.RoleExists("Administrator"))
            {
                roleManager.Create(new IdentityRole("Administrator"));
            }

            var user = new User {UserName = "someUserName"};


            if (userManager.FindByName("someUserName") == null)
            {
                var result = userManager.Create(user, "password");

                if (result.Succeeded)
                {
                    userManager.AddToRole(user.Id, "Administrator");
                }    

            }
            }

然后在 PM 控制台中,我运行了 update-database 命令,成功地种植了数据库,在 AspNetUserRoles 表格中,我可以看到用户 someUserName 和管理员角色已连接。

但是,当我在控制器上方添加属性 [Authorize(Roles = "Administrator")] 后,我被重定向到登录页面,就好像我的用户不属于该角色一样,所以我在控制器中添加了以下代码:

var x = _userManager.IsInRole(_userManager.FindByName("someUserName").Id, "Administrator");

x是假的。为什么会这样?我该如何解决?如果这不是种子数据库的正确方法,那么应该怎么做?

2个回答

7

在您的种子方法中尝试

 context.Configuration.LazyLoadingEnabled = true;

以下是我对禁用懒加载时发生的情况的猜测:当UserManager或UserStore访问IdentityUser/ApplicationUser对象的Roles属性时,由于该集合未被手动加载,因此该属性为空或为null。代码将像没有为用户分配角色一样继续执行,而事实上该集合只是从未被加载。


0

尝试

context.SaveChanges();

在 Seed 方法结束时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接