【问题标题】:Seed database for Identity 2身份 2 的种子数据库
【发布时间】:2014-06-27 18:47:02
【问题描述】:

我遇到了使用 Identity v2 为数据库播种的问题。我将 IdentityModel 从 MVC5 项目分离到我的数据访问层,在那里我也设置了 EF 迁移。所以我注释掉了在“IdentityConfig.cs”中使用的代码来创建初始用户并将代码放在我的种子数据库中,看起来像这样

  protected override void Seed(Repository.DataContext.IdentityDb context)
        {

            //    var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
            //    var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
            var owinContext = new OwinContext();
            var userManager = owinContext.GetUserManager<ApplicationUserManager>();
            var roleManager = owinContext.Get<ApplicationRoleManager>();
            const string name = "admin@admin.com";
            const string password = "Admin@123456";
            const string roleName = "Admin";

            //    //Create Role Admin if it does not exist
            var role = roleManager.FindByName(roleName);
            if (role == null)
            {
                role = new IdentityRole(roleName);
                var roleresult = roleManager.Create(role);
            }

            var user = userManager.FindByName(name);
            if (user == null)
            {
                user = new ApplicationUser { UserName = name, Email = name };
                var result = userManager.Create(user, password);
                result = userManager.SetLockoutEnabled(user.Id, false);
            }

            //    // Add user admin to Role Admin if not already added
            var rolesForUser = userManager.GetRoles(user.Id);
            if (!rolesForUser.Contains(role.Name))
            {
                var result = userManager.AddToRole(user.Id, role.Name);
            }
        }  

现在当我运行命令 update-database 时,出现错误

Value cannot be null.
Parameter name: manager

看起来,我在这两行代码中得到了 null

var userManager = owinContext.GetUserManager<ApplicationUserManager>();
var roleManager = owinContext.Get<ApplicationRoleManager>();

有什么建议吗?

【问题讨论】:

标签: c# asp.net-identity-2


【解决方案1】:

这是避免使用 OWIN 上下文的方法:

protected override void Seed(Repository.DataContext.IdentityDb context)
    var roleStore = new RoleStore<IdentityRole>(context);
    var roleManager = new RoleManager<IdentityRole>(roleStore);
    var userStore = new UserStore<ApplicationUser>(context);
    var userManager = new UserManager<ApplicationUser>(userStore);               
    var user = new ApplicationUser { UserName = "sallen" };

    userManager.Create(user, "password");                    
    roleManager.Create(new IdentityRole { Name = "admin" });
    userManager.AddToRole(user.Id, "admin");
}

【讨论】:

    【解决方案2】:

    我通过以下方式完成了这项工作:

    protected override void Seed(ApplicationDbContext context)
            {
                context.Configuration.LazyLoadingEnabled = true;
    
                //var userManager = HttpContext.Current
                //    .GetOwinContext().GetUserManager<ApplicationUserManager>();
    
                //var roleManager = HttpContext.Current
                //    .GetOwinContext().Get<ApplicationRoleManager>();
    
                var roleStore = new RoleStore<ApplicationRole, int, ApplicationUserRole>(context);
                var roleManager = new RoleManager<ApplicationRole, int>(roleStore);
                var userStore = new UserStore<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>(context);
                var userManager = new UserManager<ApplicationUser, int>(userStore);   
    ...
    

    【讨论】:

      【解决方案3】:

      您好,在 Startup 课程下,请确保您已致电 app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContextApplicationUserManager.Create); app.CreatePerOwinContextApplicationSignInManager.Create);

      app.CreatePerOwinContext(ApplicationRoleManager.Create);

      【讨论】:

        【解决方案4】:

        最新的东西都是异步的并且使用声明。 如果不存在超级用户,这对我来说是迁移添加超级用户的方法......

            protected override void Seed(Holos.Service.Models.ApplicationDbContext context)
            {
                var email       = "xxxx@xxxx.com";
                var password    = "xxxxx";
                var userStore   = new UserStore<ApplicationUser>(context);
                var userManager = new ApplicationUserManager(userStore);
        
                var user = userManager.FindByEmailAsync(email).Result;
                if (user == null)
                {
                    var adminUser = new ApplicationUser() { Email = email, UserName = email };
                    var result = userManager.CreateAsync(adminUser, password);
                    result.Wait();
                    userManager.AddClaimAsync(adminUser.Id, new Claim("Read", "*")).Wait();
                    userManager.AddClaimAsync(adminUser.Id, new Claim("Create", "*")).Wait();
                    userManager.AddClaimAsync(adminUser.Id, new Claim("Update", "*")).Wait();
                    userManager.AddClaimAsync(adminUser.Id, new Claim("Delete", "*")).Wait();
                    userManager.AddClaimAsync(adminUser.Id, new Claim("UserType", "SuperUser")).Wait();
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2013-11-13
          • 2015-07-31
          • 2016-06-15
          • 2018-02-23
          • 1970-01-01
          • 1970-01-01
          • 2016-05-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多