【问题标题】:How to Seed Database with Multiple Users assigned to Roles?如何为分配给角色的多个用户播种数据库?
【发布时间】:2016-12-07 04:16:45
【问题描述】:

我正在使用带有 Identity 的 ASP.NET MVC 来保护我的 Web 应用程序。我创建了一个“canEdit”角色,并有 5 个用户想要在数据库中播种。

我最初是这样尝试的:

bool AddUserAndRole(ERPWAG.Models.ApplicationDbContext context)
    {
        IdentityResult ir;
        var rm = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
        ir = rm.Create(new IdentityRole("canEdit"));

        var um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
        var user = new ApplicationUser()
        {
            UserName = "user1@email.com",
        };
        ir = um.Create(user, "password");
        if (ir.Succeeded == false)
            return ir.Succeeded;
        ir = um.AddToRole(user.Id, "canEdit");
        return ir.Succeeded;

        var user2 = new ApplicationUser()
        {
            UserName = "user2@email.com",
        };
        ir = um.Create(user, "password");
        if (ir.Succeeded == false)
            return ir.Succeeded;
        ir = um.AddToRole(user2.Id, "canEdit");
        return ir.Succeeded;

        var user3 = new ApplicationUser()
        {
            UserName = "user3@email.com",

        };
        ir = um.Create(user, "password");
        if (ir.Succeeded == false)
            return ir.Succeeded;
        ir = um.AddToRole(user3.Id, "canEdit");
        return ir.Succeeded;

        var user4 = new ApplicationUser()
        {
            UserName = "user4@email.com",
        };
        ir = um.Create(user, "password!");
        if (ir.Succeeded == false)
            return ir.Succeeded;
        ir = um.AddToRole(user4.Id, "canEdit");
        return ir.Succeeded;

        var user5 = new ApplicationUser()
        {
            UserName = "user5@email.com",
        };
        ir = um.Create(user, "password");
        if (ir.Succeeded == false)
            return ir.Succeeded;
        ir = um.AddToRole(user5.Id, "canEdit");
        return ir.Succeeded;
    }

然后我在我的 Configuration.cs 的 Seed 方法中调用 AddUserAndrole(context),调用 update-database 并发布。

我的用户无法登录网站。用这些用户预填充身份数据库并将他们与角色相关联的最佳方法是什么?

【问题讨论】:

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


    【解决方案1】:

    通过这个你可以传递一个用户来创建一个用户帐户并将他们分配给一个角色:

        bool CreateDefaultUsers(YourApp.Models.ApplicationDbContext context, string uname, string uemail, string upass, string urole)
        {
            IdentityResult ir;
            var um = new UserManager<ApplicationUser>(
                new UserStore<ApplicationUser>(context));
            var user = new ApplicationUser()
            {
                UserName = uname,
                Email = uemail,
            };
            ir = um.Create(user, upass);
            if (ir.Succeeded == false)
                return ir.Succeeded;
            ir = um.AddToRole(user.Id, urole);
            return ir.Succeeded;
        }
    

    然后像这样从你的种子方法中调用它:

        ir = CreateDefaultUsers(context, "Bob", "bob@bobswebsite.com", "Password1", "Publisher");
    

    如果您愿意,您或许可以弄清楚如何创建一个数组并遍历您的用户,或者使用您的用户值重复调用 8 次。

    我还会考虑@Steve Greene 发布的关于密码要求的内容。

    [更新]

    此示例假定您没有使用电子邮件作为用户名。无论如何方法都是一样的。

    【讨论】:

      【解决方案2】:

      假设您的代码已运行并且记录已插入表中(首先检查),我敢打赌您的密码策略可能不允许“密码”。

      搜索您的 PasswordValidator 规则。我的是:

      // Configure validation logic for passwords
      manager.PasswordValidator = new PasswordValidator
      {
          RequiredLength = 8,
          RequireNonLetterOrDigit = false,
          RequireDigit = true,
          RequireLowercase = true,
          RequireUppercase = true,
      };
      

      所以要么让您的密码符合规则,要么更改验证器。

      这是播种身份的另一个链接:Seed Entities AND Users, Roles?

      【讨论】:

      • 感谢您的回答。在发布我的问题之前,我“清理”了电子邮件地址和密码。因此,密码很强大,只有一个大写字母、一个数字、一个特殊字符和所需的长度。
      • 记录在数据库中?登录结果OK?你的问题在哪里?
      猜你喜欢
      • 2012-11-02
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 2016-02-05
      • 2020-09-11
      • 1970-01-01
      • 2020-08-16
      相关资源
      最近更新 更多