种子数据到UserRole表.net核心

时间:2017-11-27 09:04:06

标签: entity-framework asp.net-core-mvc user-roles

我想在.NET Core Default MVC应用程序上启动项目之前,使用admin用户为默认数据库播种。代码如下:

public void SeedDb(ApplicationDbContext Context, IServiceProvider ServiceProvider, IConfiguration Configuration)
    {

        if (Context.Users.Count() > 0) return;

        var UserManager = ServiceProvider.GetRequiredService<UserManager<ApplicationUser>>();

        var ApplicationUser = new ApplicationUser()
        {
            Email = Configuration["Email"],
            NormalizedEmail = Configuration["Email"],
            LockoutEnabled = false,
            NormalizedUserName = Configuration["Email"],
            SecurityStamp = "579355dd - a64c - 498d - a0b5 - 9e55754c9109",
            EmailConfirmed = true,
            ConcurrencyStamp = null,
            Id = "977ec1a5-1ae7-4658-952a-6b5dccd75a85",
            PasswordHash ="",
            PhoneNumber = "333333333333",
            LockoutEnd = null,
            AccessFailedCount = 1,
            PhoneNumberConfirmed = true,
            TwoFactorEnabled = false,
            UserName = Configuration["Email"]
        };

        var Password =  HashPassword(ApplicationUser, Configuration["Password"]);

        if (VerifyHashedPassword(ApplicationUser, Password, Configuration["Password"]) == PasswordVerificationResult.Success)
        {
            ApplicationUser.PasswordHash = Password;
        }

        Context.Users.Add(ApplicationUser);
        Context.SaveChanges();

        var RoleManager = ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        string[] Roles = { "Admin", "Manager", "User" };

        foreach (string RoleName in Roles) {
            RoleManager.CreateAsync(new IdentityRole(RoleName));
        }

         var Admin = Context.Users.SingleOrDefault(m => m.Email == Configuration["Email"]);
         var Role =  Context.Roles.SingleOrDefault(m => m.Name == Configuration["Role"]);
         IdentityUserRole<string> UserRole = new IdentityUserRole<string>() { UserId = Admin.Id, RoleId = Role.Id };

         Context.UserRoles.Add(UserRole);
         Context.SaveChanges();
    }

一切都运行得很完美,除非我无法使用Data播放UserRole DB。从DBContext我添加IdentityUserRole实体并将更改保存到DB。虽然在DB下没有传递任何东西。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

创建一个名为StartupDbInitializer的小组:

using System;
using System.Collections.Generic;
using System.Linq;
using Core.Entities;
using Microsoft.AspNetCore.Identity;

namespace Core.Startups
{
    public class StartupDbInitializer
    {
        private const string AdminEmail = "admin@admin.com";
        private const string AdminPassword = "StrongPasswordAdmin123!";

        private static readonly List<IdentityRole> Roles = new List<IdentityRole>()  
        {
            new IdentityRole {Name = "Admin", NormalizedName = "ADMIN", ConcurrencyStamp = Guid.NewGuid().ToString()}
        };

        public static void SeedData(ApplicationDbContext dbContext, UserManager<User> userManager)
        {
            dbContext.Database.EnsureCreated();
            AddRoles(dbContext);
            AddUser(dbContext, userManager);
            AddUserRoles(dbContext, userManager);
        }

        private static void AddRoles(ApplicationDbContext dbContext)
        {
            if (!dbContext.Roles.Any())
            {
                foreach (var role in Roles)
                {
                    dbContext.Roles.Add(role);
                    dbContext.SaveChanges();
                } 
            }
        }

        private static async void AddUser(ApplicationDbContext dbContext, UserManager<User> userManager)
        {
            if (!dbContext.Users.Any())
            {
                var user = new User { 
                    UserName = AdminEmail, 
                    Email = AdminEmail, 
                    IsEnabled = true, 
                    EmailConfirmed = true,
                };
                await userManager.CreateAsync(user, AdminPassword);
            }
        }

        private static void AddUserRoles(ApplicationDbContext dbContext, UserManager<User> userManager)
        {
            if (!dbContext.UserRoles.Any())
            {
                var userRole = new IdentityUserRole<string>
                {
                    UserId = dbContext.Users.Single(r => r.Email == AdminEmail).Id,
                    RoleId = dbContext.Roles.Single(r => r.Name == "Admin").Id
                };
                dbContext.UserRoles.Add(userRole);
                dbContext.SaveChanges();
            }
        }
    }
}

然后使用Startup的{​​{1}}方法调用它:

Configure

上面,我注入了我的public void Configure( IApplicationBuilder app, IHostingEnvironment env, ApplicationDbContext dbContext, UserManager<User> userManager, ) { // rest of code... StartupDbInitializer.SeedData(dbContext, userManager); } DbContext

答案 1 :(得分:0)

尝试这一行......它必须有效。

ApplicationUser user = await _usermanager.FindByEmailAsync("your.email@mymail.com");
if (!await _usermanager.IsInRoleAsync(user, "Admin"))
{
    await _usermanager.AddToRoleAsync(user, "Admin");
}

当您尝试它并且它可以工作时,如果您愿意,请将其更改为您的配置参数。要让它工作并不难,你在UserManager和RoleManager类中拥有所需的一切。

我仍然说你必须在插入之前检查角色是否存在于表中,每次运行应用程序之前我都会填充所有角色,然后再添加支票。

if ((await _roleManager.FindByNameAsync("Admin")) == null)
{
    await _roleManager.CreateAsync(new IdentityRole { Name = "Admin" });
}