c# - 如何在 asp core 2 中播种用户身份属性?

标签 c# asp.net-identity asp.net-core-2.0 seeding

我有这个播种类,它总是无法在用户表中插入记录,

我认为使用 CreateAsync 是不合适的,因为该方法不是异步的,用户管理器不会为记录播种。所以我尝试使用散列密码手动播种,但我无法登录。我正在发布这两种方法

为什么数据库初始化时没有插入用户信息? <强>1。使用 UserManager CreateAsync

       public void SeedData()
        {
            using (var serviceScope = scopeFactory.CreateScope())
            {
                using (var context = serviceScope.ServiceProvider.GetService<ArtCoreDbContext>())
                {
         if (!context.ApplicationUser.Any())
                  {
               var user = new ApplicationUser
                        {
                            CityId = context.Cities.Where(g => g.Name == "Abu Nusair").SingleOrDefault().Id,
                            CountryId = context.Countries.Where(g => g.Name == "Jordan").SingleOrDefault().Id,
                             Email = "maizer85@hotmail.com",
                            FirstName = "Zaid",
                            GenderId = context.Genders.Where(g => g.Name == "Female").SingleOrDefault().Id,
                            IsActive = true,
                            LastName = "Abu Maizar",
                            MaritalStatusId = context.MaritalStatus.Where(g => g.Name == "Single").SingleOrDefault().Id,
                            NationalityId = context.Nationalities.Where(g => g.Name == "Jordanian").SingleOrDefault().Id,
                            OccupationId = context.Occupations.Where(g => g.Name == "MD").SingleOrDefault().Id,
                             PersonalPhotoUrl = null,
                             PhoneNumber = "4243244990",
                             PhoneNumberConfirmed = false,
                             PostalCode = 91335,
                             SocialSecurityNo = "AABBCC",
                            StateId = context.States.Where(g => g.Name == "Amman").SingleOrDefault().Id,
                            StatusId = context.Statuses.Where(g => g.Name == "Active").SingleOrDefault().Id,
                             UserName = "Zaid",

                        };
                         userManager.CreateAsync(user, "String@string85");
                         context.SaveChanges();
                    }

                }
            }
        }

<强>2。手动种子,

         public void SeedData()
            {
                using (var serviceScope = scopeFactory.CreateScope())
                {
                    using (var context = serviceScope.ServiceProvider.GetService<ArtCoreDbContext>())
                    {
                        if (!context.ApplicationUser.Any())
                        {

                            context.ApplicationUser.AddRange(
                             new ApplicationUser
                             {
                                 Id = Guid.NewGuid().ToString("N"),
                                 AccessFailedCount = 0,
                                 AdminLevel = "LA",
                                 ApartmentNo = 0,
                                 CityId = context.Cities.Where(g => g.Name == "Abu Nusair").SingleOrDefault().Id,
                                 ConcurrencyStamp = Guid.NewGuid().ToString("N"),
                                 ContactAddress = "USA",
                                 ContactCountry = "USA",
                                 CountryId = context.Countries.Where(g => g.Name == "Jordan").SingleOrDefault().Id,
                                 DateCreated = DateTime.UtcNow,
                                 Email = "maizer85@hotmail.com",
                                 EmailConfirmed = false,
                                 FirstName = "Zaid",
                                 GenderId = context.Genders.Where(g => g.Name == "Female").SingleOrDefault().Id,
                                 IsActive = true,
                                 LastLoggedIn = DateTime.UtcNow,
                                 LastName = "Abu Maizar",
                                 Locality = "LA",
                                 LockoutEnabled = true,
                                 LockoutEnd = null,
                                 MaritalStatusId = context.MaritalStatus.Where(g => g.Name == "Single").SingleOrDefault().Id,
                                 NationalityId = context.Nationalities.Where(g => g.Name == "Jordanian").SingleOrDefault().Id,
                                 NormalizedEmail = "MAIZER85@HOTMAIL.COM",
                                 NormalizedUserName = "ZAID",
                                 OccupationId = context.Occupations.Where(g => g.Name == "MD").SingleOrDefault().Id,
                                 PasswordHash = HashPassword("Zaid@core85"),
                                 PersonalPhotoUrl = null,
                                 PhoneNumber = "4243244990",
                                 PhoneNumberConfirmed = false,
                                 PostalCode = 91335,
                                 SecurityStamp = Guid.NewGuid().ToString("N"),
                                 SocialSecurityNo = "AABBCC",
                                 StateId = context.States.Where(g => g.Name == "Amman").SingleOrDefault().Id,
                                  StatusId = context.Statuses.Where(g => g.Name == "Active").SingleOrDefault().Id,
                                 StreetDirection = "LA",
                                 StreetNo = "123231",
                                 TwoFactorEnabled = false,
                                 UserName = "Zaid",
                                 VerificationPhotoUrl = null

                             }
                        );
                            context.SaveChanges();
                        }
                    }
                }
            }

密码哈希方法,

public static string HashPassword(string password)
        {
            byte[] salt;
            byte[] buffer2;
            if (password == null)
            {
                throw new ArgumentNullException("password");
            }
            using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, 0x10, 0x3e8))
            {
                salt = bytes.Salt;
                buffer2 = bytes.GetBytes(0x20);
            }
            byte[] dst = new byte[0x31];
            Buffer.BlockCopy(salt, 0, dst, 1, 0x10);
            Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20);
            return Convert.ToBase64String(dst);
        }

最佳答案

这里有一个类似的话题:Creating Asp.net Identity user in Seed method of Db Initializer

所以你需要使用非异步扩展方法。添加 Microsoft.AspNet.Identity 程序集和 using Microsoft.AspNet.Identity

有一个例子:https://stackoverflow.com/a/27499759/3710672

关于手动播种。我认为您无法登录,因为您使用的 HashPassword 函数与 UserManager 在检查密码时使用的算法不同。

要使其正常工作,请尝试使用 userManager.PasswordHasher.HashPassword(..) 方法而不是您的函数。

在您的 ApplicationUser 中:

...
PasswordHash = userManager.PasswordHasher.HashPassword("Zaid@core85"),
...

关于c# - 如何在 asp core 2 中播种用户身份属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48000783/

相关文章:

asp.net-core - 将 DI 用于连接字符串时的脚手架

c# - SQL批量复制内存问题

c# - MongoDB C# 驱动程序 - POCO 引用的序列化?

c# - 来自 AForge FFMPEG 的图片框为空 - C#/WinForms

asp.net-mvc - UserManager.AddPasswordAsync() 返回 "Name cannot be null or empty"

c# - 将 'hd' 参数附加到 redirectUrl ASP.NET Core 1 with Identity 3

asp.net-core - Asp.Net Core Identity - 使用角色和缓存授权属性?

c# - 在 Docker 中运行的 ASP .Net Core 2.0 中获取用户 IP

linux - 构建图像时将构建参数传递给 dockerfile 时出错 - '$MyVersion' 不是有效的版本字符串

c# - 如何保存上传的文件?由 c#mvc