Identity Server 4 войти в существующую базу данных - PullRequest
1 голос
/ 10 июля 2020
• 1000 авторизоваться. Проблема в том, что я не хочу использовать идентификатор asp. net. Как использовать сервер идентификации в качестве единого входа?
services.AddIdentityServer(option => {
    option.UserInteraction.LoginUrl = "/Accounts/Login";
    })
    .AddInMemoryApiResources(Constants.GetApis())
    .AddInMemoryIdentityResources(Constants.GetIdentityResources())
    .AddInMemoryClients(Constants.GetClients())
    .AddDeveloperSigningCredential(persistKey: false);

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Не нужно избавляться от личности asp. net. Просто реализуйте IUserStore и, как показано ниже, реализуйте свой собственный механизм для получения данных из существующей базы данных. Ниже приведены некоторые примеры для реализации IUserStore

 public async Task<Users> FindByIdAsync(string userId, CancellationToken cancellationToken)
    {
        //here you have to write the code to get data from existing db like ado.net or some third party api
    }

В приведенном ниже методе вы должны создать класс poco для своего пользователя таблицу в существующей базе данных и передайте ее.

public Task<string> GetUserIdAsync(Users user, CancellationToken cancellationToken)
    {
        return Task.FromResult(user.user_id.ToString());//user_id will be replaced by your user id column name
    }

Также добавьте свой класс User poco, как показано

 var builder = services.AddIdentityServer()
                              .AddInMemoryIdentityResources(Config.GetIdentityResources())
                              //.AddInMemoryApiResources(Config.GetApis())
                              //.AddInMemoryClients(Config.GetClients())
                              .AddClientStore<ClientStore>()
                              .AddResourceStore<ResourceStore>()
                              .AddAspNetIdentity<Users>()//here
0 голосов
/ 12 июля 2020

Да, мы можем реализовать собственное хранилище идентификаторов.

  • Хранилище данных
  • 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 enter image description here 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, ...)

enter image description here

enter image description here

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 очень мощный. Надеюсь, этот ответ поможет вам начать работу.

0 голосов
/ 11 июля 2020

Вы можете реализовать IProfileService в своем собственном классе, чтобы получать пользовательские данные из вашего собственного хранилища данных. Это может быть любой тип хранилища / схемы. Документация для IProfileService - здесь .

После реализации вашего класса вы должны зарегистрировать его с помощью метода расширения:

builder.AddProfileService<MyCustomUserProfileService>();

где builder имеет введите IIdentityServerBuilder.

Кроме того, используя аналогичный logi c, вы должны реализовать свой собственный валидатор пароля logi c, используя интерфейс IResourceOwnerPasswordValidator (документация здесь ) и зарегистрируйте свой класс реализации, используя метод расширения:

builder.AddResourceOwnerValidator<MyCustomUserResourceOwnerPasswordValidator>();
...