如何在 asp core2 中正确植入用户身份?
How to seed a user identity properly in asp core2?
我有这个播种 class 一直无法在用户 table,
中插入记录
我认为使用 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
。
有个例子:
关于手动播种。我认为您无法登录,因为您使用的 HashPassword 函数与 UserManager 在检查密码时使用的算法不同。
要使其正常工作,请尝试使用 userManager.PasswordHasher.HashPassword(..)
方法而不是您的函数。
在您的 ApplicationUser 中:
...
PasswordHash = userManager.PasswordHasher.HashPassword("Zaid@core85"),
...
这个实现对我有用
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",
};
Task<IdentityResult> createTask = userManager.CreateAsync(user, "Temp_123");
createTask.Wait();
}
}
}
}
我有这个播种 class 一直无法在用户 table,
中插入记录我认为使用 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
。
有个例子:
关于手动播种。我认为您无法登录,因为您使用的 HashPassword 函数与 UserManager 在检查密码时使用的算法不同。
要使其正常工作,请尝试使用 userManager.PasswordHasher.HashPassword(..)
方法而不是您的函数。
在您的 ApplicationUser 中:
...
PasswordHash = userManager.PasswordHasher.HashPassword("Zaid@core85"),
...
这个实现对我有用
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",
};
Task<IdentityResult> createTask = userManager.CreateAsync(user, "Temp_123");
createTask.Wait();
}
}
}
}