【问题标题】:ASP.net MVC + ASP.net Identity Seeding roles and usersASP.net MVC + ASP.net Identity Seeding 角色和用户
【发布时间】:2013-12-26 13:29:45
【问题描述】:

在 Migrations Configuration 类中,有 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 是假的。为什么会这样?我该如何解决?如果这不是播种数据库的正确方法,那是?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity


    【解决方案1】:

    试试你的种子方法

     context.Configuration.LazyLoadingEnabled = true;
    

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

    【讨论】:

      【解决方案2】:

      试试

      context.SaveChanges();
      

      在种子方法的末尾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-01
        • 2015-05-19
        • 2016-05-03
        • 1970-01-01
        • 2016-10-24
        • 2013-11-10
        • 2018-03-29
        • 1970-01-01
        相关资源
        最近更新 更多