Да, мы можем реализовать собственное хранилище идентификаторов.
- Хранилище данных
- UserService и ProfileService
- Внедрение служб в AccountControllers
Хранение данных
Реализуйте свой собственный IdentityDbContext с вашими собственными моделями сущностей, связанных с пользователем.
public class IdentityDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<UserClaim> UserClaims { get; set; }
public DbSet<UserLogin> UserLogins { get; set; }
public DbSet<UserSecret> UserSecrets { get; set; }
public IdentityDbContext(
DbContextOptions<IdentityDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
...
}
}
Убедитесь, что есть ConcurrencyStamp , чтобы избегайте проблемы параллелизма для серверов балансировки нагрузки.
public class User : IConcurrencyAware
{
[Key]
public Guid Id { get; set; }
[MaxLength(200)]
[Required]
public string Subject { get; set; }
[MaxLength(200)]
public string Username { get; set; }
[MaxLength(200)]
public string Password { get; set; }
[Required]
public bool Active { get; set; }
[MaxLength(200)]
public string Email { get; set; }
[MaxLength(200)]
public string SecurityCode { get; set; }
public DateTime SecurityCodeExpirationDate { get; set; }
[ConcurrencyCheck]
public string ConcurrencyStamp { get; set; } = Guid.NewGuid().ToString();
public ICollection<UserClaim> Claims { get; set; } = new List<UserClaim>();
public ICollection<UserLogin> Logins { get; set; } = new List<UserLogin>();
public ICollection<UserSecret> Secrets { get; set; } = new List<UserSecret>();
}
Реализация хранилища данных является очень традиционной Entity Framework.
UserService и ProfileService
- ProfileService должен реализовать
IdentityServer4.Services.IProfileService
We will have GetProfileDataAsync()
and IsActiveAsync()
here.
- A UserService should handle all the CRUD operations and common functions like resetting password, check active user..., and can be extended to have external login features.
Inject to Controllers
Hook UserService and ProfileService to the related controllers to handle UI requests (login, logout, ...)
I folllowed an excellent Kevin Dockx course ( Работа с учетными данными при защите приложения ASP. NET Core 3 ) на PluralSight.
Исходный код находится на GitHub . https://github.com/KevinDockx/DealingWithCredentialsWhenSecuringAspNetCore3
Но в курсе используется IdentityServer4 версии 3.x. Для последней версии 4.0.x мы можем получить код управления пользователями из репозитория QuickstartUI .
Просто переключите TestUserStore
на нашу собственную пользовательскую службу. введите описание изображения здесь
IdentityServer4 очень мощный. Надеюсь, этот ответ поможет вам начать работу.