Да, вам лучше наследовать от базового IdentityUser
класса и добавить туда то, что вам нужно.
1. Наследовать от IndentityUser
using Microsoft.AspNetCore.Identity;
using System.ComponentModel.DataAnnotations;
namespace DL.SO.Infra.CrossCutting.Identity.Entities
{
public class AppUser : IdentityUser<int>
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
public string DisplayName => $"{ FirstName } { LastName }";
public AppUserStatus Status { get; set; }
}
// This is in separate file, but for simplicity I would just add it here
public enum AppUserStatus
{
Active = 1,
Inactive = 2
}
}
Вы видите здесь, что я добавил имя, поле фамилии, а также статус к пользовательской сущности приложения.
2. Создать DbContext
из правильной перегрузки
Если вы добавляете дополнительную информацию в базу IdentityUser
(фактически, какие-либо классы идентификаторов, которые вы изменили) или хотите изменить тип первичного ключа, вам нужно создать DbContext
, используя правильную перегрузку, которую он обеспечивает.
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using DL.SO.Infra.CrossCutting.Identity.Entities;
namespace DL.SO.Infra.CrossCutting.Identity
{
public class AppIdentityDbContext
: IdentityDbContext<AppUser, AppRole, int, AppUserClaim, AppUserRole,
AppUserLogin, AppRoleClaim, AppUserToken>
{
public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options)
: base(options) { }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<AppUser>(b =>
{
// Rename the column Id to UserId (optional)
b.Property(u => u.Id).HasColumnName("UserId");
b.ToTable("User");
});
builder.Entity<AppRole>().ToTable("Role");
builder.Entity<AppUserRole>().ToTable("UserRole");
builder.Entity<AppUserClaim>().ToTable("UserClaim");
builder.Entity<AppRoleClaim>().ToTable("RoleClaim");
builder.Entity<AppUserLogin>().ToTable("UserLogin");
builder.Entity<AppUserToken>().ToTable("UserToken");
}
}
}
3. Зарегистрировать Identity Framework при запуске
Затем вам необходимо использовать пользовательские DbContext
и классы при регистрации платформы Identity на Startup.cs
. Здесь я продемонстрировал использование метода расширения, но вы также можете поместить их непосредственно в Startup.cs
.
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using DL.SO.Infra.CrossCutting.Identity.Entities;
using DL.SO.Infra.CrossCutting.Identity.Settings;
using System;
namespace DL.SO.Infra.CrossCutting.Identity.Extensions
{
public static class ServiceCollectionExtensions
{
public static void AddIdentityService(this IServiceCollection services,
string connectionString, AppIdentitySettings settings)
{
string assemblyNamespace = typeof(AppIdentityDbContext).Namespace;
services.AddDbContext<AppIdentityDbContext>(options =>
options.UseSqlServer(connectionString, optionsBuilder =>
optionsBuilder.MigrationsAssembly(assemblyNamespace)
)
);
services.AddIdentity<AppUser, AppRole>(options => // <-- Your custom classes
{
// User settings
options.User.RequireUniqueEmail = settings.User.RequireUniqueEmail;
// Password settings
options.Password.RequireDigit = settings.Password.RequireDigit;
options.Password.RequiredLength = settings.Password.RequiredLength;
options.Password.RequireLowercase = settings.Password.RequireLowercase;
options.Password.RequireNonAlphanumeric = settings.Password.RequireNonAlphanumeric;
options.Password.RequireUppercase = settings.Password.RequireUppercase;
// Lockout settings
options.Lockout.AllowedForNewUsers = settings.Lockout.AllowedForNewUsers;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(settings.Lockout.DefaultLockoutTimeSpanInMins);
options.Lockout.MaxFailedAccessAttempts = settings.Lockout.MaxFailedAccessAttempts;
})
.AddEntityFrameworkStores<AppIdentityDbContext>() // <-- Your custom DbContext
.AddDefaultTokenProviders();
}
}
}