Зарегистрированные пользовательские строки подключения в .NET Core - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть приложение, которое использует базу данных идентификационных данных для хранения пользователей и клиентов.

У каждого клиента также есть отдельная база данных со своими данными, и его строка подключения хранится в таблице Customer в базе данных идентификационных данных.

AspNetUsers имеет поле, чтобы указать, к какому клиенту принадлежит пользователь (также с идентификатором db).

Я хочу назначить строку подключения пользователю, когда он входит в систему, и сделать ее доступной вприложение на время сеанса.

В настоящее время у меня есть модель клиента:

public partial class `Customer`
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int NoLicenses { get; set; }
    public bool? Enabled { get; set; }
    public string CustomerConnectionString { get; set; }
}

и модель пользователя:

public class ApplicationUser : IdentityUser
{
    public string CustomerId { get; set; }

    public bool? IsEnabled { get; set; }

    // there ideally I'd have a connstring property
}

Модели отображают поля таблицы базы данных.

Я использую .NET Core 1.1 и EF Core.

1 Ответ

0 голосов
/ 15 ноября 2018

Используя шаблон удостоверения ASP.NET по умолчанию, вы можете:

  1. расширить класс ApplicationUser в папке Models:

    public class ApplicationUser : IdentityUser
    {
        public string CustomerId { get; set; }
    
        public bool? IsEnabled { get; set; }
    
        //add your custom claims
        public string CustomerConnectionString { get; set; }
    }
    
  2. Добавьте свою пользовательскую модель в ApplicationDbContext в папке данных:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            // Customize the ASP.NET Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);
    
    
        }
    
        public DbSet<Customer> Customers { get; set; }
    }
    
  3. Синхронизируйте вашу базу данных: Add-Migration xxxx, затем выполните команду Update-Database в консоли диспетчера пакетов. Теперь у вас есть таблица Customer и столбец CustomerConnectionString в таблице AspNetUsers.

  4. Создайте собственную реализацию IUserClaimsPrincipalFactory, унаследовав реализацию по умолчанию для генерации ClaimsPrincipal от вашего пользователя:

    public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
    {
        public AppClaimsPrincipalFactory(
          UserManager<ApplicationUser> userManager
          , RoleManager<IdentityRole> roleManager
          , IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, roleManager, optionsAccessor)
        { }
    
        public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
        {
            var principal = await base.CreateAsync(user);
    
            if (!string.IsNullOrWhiteSpace(user.CustomerId))
            {
    
                ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                new Claim("customid", user.CustomerId)
                });
            }
    
            if (!string.IsNullOrWhiteSpace(user.CustomerConnectionString))
            {
    
                ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                new Claim("CustomerConnectionString", user.CustomerConnectionString)
                });
            }
            return principal;
        }
    }
    
  5. Зарегистрируйте пользовательскую фабрику, которую вы только что создали, в классе запуска вашего приложения после добавления службы идентификации:

    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    
    services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
    
      services.AddScoped<Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();
    
  6. Тогда вы можете получить доступ к таким претензиям, как:

    var connectString = User.Claims.FirstOrDefault(c => c.Type == "CustomerConnectionString").Value;
    
  7. Измените создание / редактирование пользовательского представления / контроллера, добавьте раскрывающийся список клиентов в представлении, получите пользовательский идентификатор в функции Register в AccountController, запросите строку подключения нестандартного из db и сохраните в ApplicationUser объект:

     var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
     var result = await _userManager.CreateAsync(user, model.Password);
    
...