بازنویسی متد مقدار دهی اولیهی کاربر ادمین در ASP.NET Core Identity توسط متد HasData در EF Core
نویسنده: وحید نصیری
تاریخ: ۱۳۹۸/۰۶/۱۰ ۱۵:۴۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
namespace ASPNETCoreIdentitySample.DataLayer.Mappings
{
public class RoleConfiguration : IEntityTypeConfiguration<Role>
{
private readonly SiteSettings _siteSettings;
private readonly ILookupNormalizer _keyNormalizer;
public RoleConfiguration(SiteSettings siteSettings, ILookupNormalizer keyNormalizer)
{
_siteSettings = siteSettings ?? throw new ArgumentNullException(nameof(siteSettings));
_keyNormalizer = keyNormalizer ?? throw new ArgumentNullException(nameof(keyNormalizer));
}
public void Configure(EntityTypeBuilder<Role> builder)
{
builder.ToTable("AppRoles");
var adminUserSeed = _siteSettings.AdminUserSeed;
builder.HasData(
new Role
{
Id = 1,
Name = adminUserSeed.RoleName,
NormalizedName = _keyNormalizer.NormalizeName(adminUserSeed.RoleName),
ConcurrencyStamp = Guid.NewGuid().ToString()
});
}
}
} public class UserConfiguration : IEntityTypeConfiguration<User>
{
private readonly SiteSettings _siteSettings;
private readonly ILookupNormalizer _keyNormalizer;
private readonly IPasswordHasher<User> _passwordHasher;
public UserConfiguration(
SiteSettings siteSettings,
ILookupNormalizer keyNormalizer,
IPasswordHasher<User> passwordHasher)
{
_siteSettings = siteSettings ?? throw new ArgumentNullException(nameof(siteSettings));
_keyNormalizer = keyNormalizer ?? throw new ArgumentNullException(nameof(keyNormalizer));
_passwordHasher = passwordHasher ?? throw new ArgumentNullException(nameof(passwordHasher));
}
public void Configure(EntityTypeBuilder<User> builder)
{
builder.ToTable("AppUsers");
var adminUserSeed = _siteSettings.AdminUserSeed;
builder.HasData(
new User
{
Id = 1,
UserName = adminUserSeed.Username,
NormalizedUserName = _keyNormalizer.NormalizeName(adminUserSeed.Username),
Email = adminUserSeed.Email,
NormalizedEmail = _keyNormalizer.NormalizeEmail(adminUserSeed.Email),
EmailConfirmed = true,
IsEmailPublic = true,
LockoutEnabled = true,
TwoFactorEnabled = false,
PasswordHash = _passwordHasher.HashPassword(null, adminUserSeed.Password),
ConcurrencyStamp = Guid.NewGuid().ToString(),
SecurityStamp = string.Empty,
IsActive = true
});
}
} public class UserRoleConfiguration : IEntityTypeConfiguration<UserRole>
{
public void Configure(EntityTypeBuilder<UserRole> builder)
{
builder.HasOne(userRole => userRole.Role)
.WithMany(role => role.Users)
.HasForeignKey(userRole => userRole.RoleId);
builder.HasOne(userRole => userRole.User)
.WithMany(user => user.Roles)
.HasForeignKey(userRole => userRole.UserId);
builder.ToTable("AppUserRoles");
builder.HasData(
new UserRole
{
UserId = 1,
RoleId = 1
});
}
} public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext CreateDbContext(string[] args)
{
// ....
services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
services.TryAddScoped<IPasswordHasher<User>, PasswordHasher<User>>(); using Microsoft.EntityFrameworkCore.Infrastructure;
namespace ASPNETCoreIdentitySample.DataLayer.Context
{
public class ApplicationDbContext :
IdentityDbContext<User, Role, int, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>,
IUnitOfWork
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var siteSettings = this.GetService<IOptionsSnapshot<SiteSettings>>()?.Value;
var lookupNormalizer = this.GetService<ILookupNormalizer>();
var passwordHasher = this.GetService<IPasswordHasher<User>>()
modelBuilder.ApplyConfiguration(new RoleConfiguration(siteSettings, lookupNormalizer));
modelBuilder.ApplyConfiguration(new UserConfiguration(siteSettings, lookupNormalizer, passwordHasher));
modelBuilder.ApplyConfiguration(new UserUsedPasswordConfiguration(siteSettings, passwordHasher));
// ... dotnet ef migrations --startup-project ../ASPNETCoreIdentitySample/ add V1
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var passwordHasher = this.GetService<IPasswordHasher<User>>();