ASP.net MVC+ASP.net身份种子角色和用户



在迁移配置类中,有一个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控制台中,我运行了更新数据库,它成功地为数据库播种了种子,在表AspNetUserRoles中,我可以看到用户someUserName和Administrator角色是连接的。

但当我把属性[Authorize(Roles = "Administrator")]放在控制器上时,我被重定向到登录页面,就好像我的用户不在那个角色中一样,所以我在控制器中添加了一行:

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

x是假的。为什么会发生这种情况?我该怎么修?若这不是种子数据库的正确方式,那个么是哪一种呢?

尝试您的种子方法

 context.Configuration.LazyLoadingEnabled = true;

以下是我对禁用延迟加载时发生的情况的猜测,当UserManager或UserStore访问IdentityUser/ApplicationUser对象时,该对象的Roles属性为null或为空,因为该集合不是手动加载的。然后,代码继续执行,就像没有向用户分配角色一样,而事实上,该集合根本没有加载。

尝试

context.SaveChanges();

在Seed方法的末尾。

最新更新