Ядро Aspnet Идентификационный номер пользователя ApiAuthorizationDbContext - PullRequest
1 голос
/ 02 октября 2019

Я работаю с Aspnet Core 3.0 с угловым проектом. Я вижу этот новый ApiAuthorizationDbContext, и я хотел переопределить имя таблицы и идентификатор пользователя (для int), но я не могу это сделать. Любое тело знает хитрость?

  • Это класс для контекста, в котором я говорю ему переопределить имя таблицы, но он создает таблицы AspNetUser и User! почему бы просто не создать его как обычно
public class ApplicationDbContext : ApiAuthorizationDbContext<AppUser>
    {
        public ApplicationDbContext(
            DbContextOptions options,
            IOptions<OperationalStoreOptions> operationalStoreOptions) : base(options, operationalStoreOptions)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<AppUser>(entity => { entity.ToTable(name: "User"); });
            modelBuilder.Entity<AppRole>(entity => { entity.ToTable(name: "Role"); });
        }
    }
  • Вот мой пользователь
public class AppUser : IdentityUser
{
}
  • Обычно я переопределяю первичный ключ с помощьюAppUser, но он не работает из-за ApiAuthorizationDbContext.

Кто-нибудь есть идеи?

1 Ответ

1 голос
/ 03 октября 2019

Для пользовательских таблиц пользователей и ролей с ApiAuthorizationDbContext вы можете выполнить следующие шаги:

  1. Создать угловой угловой шаблон Asp.Net с удостоверением
  2. ДобавитьКласс пользователя и роли

    public class AppUser : IdentityUser<int>
    {
    }
    public class AppRole : IdentityRole<int>
    {
    }
    
  3. Добавить пользовательский ApiAuthorizationDbContext

    /// <summary>
    /// Database abstraction for a combined <see cref="DbContext"/> using ASP.NET Identity and Identity Server.
    /// </summary>
    /// <typeparam name="TUser"></typeparam>
    /// <typeparam name="TRole"></typeparam>
    /// <typeparam name="TKey">Key of the IdentityUser entity</typeparam>
    public class KeyApiAuthorizationDbContext<TUser, TRole, TKey> : IdentityDbContext<TUser, TRole, TKey>, IPersistedGrantDbContext
        where TUser : IdentityUser<TKey>
        where TRole : IdentityRole<TKey>
        where TKey : IEquatable<TKey>
    {
        private readonly IOptions<OperationalStoreOptions> _operationalStoreOptions;
    
        /// <summary>
        /// Initializes a new instance of <see cref="ApiAuthorizationDbContext{TUser, TRole, TKey}"/>.
        /// </summary>
        /// <param name="options">The <see cref="DbContextOptions"/>.</param>
        /// <param name="operationalStoreOptions">The <see cref="IOptions{OperationalStoreOptions}"/>.</param>
        public KeyApiAuthorizationDbContext(
            DbContextOptions options,
            IOptions<OperationalStoreOptions> operationalStoreOptions)
            : base(options)
        {
            _operationalStoreOptions = operationalStoreOptions;
        }
    
        /// <summary>
        /// Gets or sets the <see cref="DbSet{PersistedGrant}"/>.
        /// </summary>
        public DbSet<PersistedGrant> PersistedGrants { get; set; }
    
        /// <summary>
        /// Gets or sets the <see cref="DbSet{DeviceFlowCodes}"/>.
        /// </summary>
        public DbSet<DeviceFlowCodes> DeviceFlowCodes { get; set; }
    
        Task<int> IPersistedGrantDbContext.SaveChangesAsync() => base.SaveChangesAsync();
    
        /// <inheritdoc />
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value);
        }
    }
    
    /// <summary>
    /// Database abstraction for a combined <see cref="DbContext"/> using ASP.NET Identity and Identity Server.
    /// </summary>
    /// <typeparam name="TUser"></typeparam>
    public class ApiAuthorizationDbContext<TUser> : KeyApiAuthorizationDbContext<TUser, IdentityRole, string>
        where TUser : IdentityUser
    {
        /// <summary>
        /// Initializes a new instance of <see cref="ApiAuthorizationDbContext{TUser}"/>.
        /// </summary>
        /// <param name="options">The <see cref="DbContextOptions"/>.</param>
        /// <param name="operationalStoreOptions">The <see cref="IOptions{OperationalStoreOptions}"/>.</param>
        public ApiAuthorizationDbContext(
            DbContextOptions options,
            IOptions<OperationalStoreOptions> operationalStoreOptions)
            : base(options, operationalStoreOptions)
        {
        }
    }
    
  4. Изменить DbContext

    public class ApplicationDbContext : KeyApiAuthorizationDbContext<AppUser, AppRole, int>
    {
        public ApplicationDbContext(
            DbContextOptions options,
            IOptions<OperationalStoreOptions> operationalStoreOptions) : base(options, operationalStoreOptions)
        {
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<AppUser>(entity => { entity.ToTable(name: "User"); });
            modelBuilder.Entity<AppRole>(entity => { entity.ToTable(name: "Role"); });
        }
    }
    
  5. Зарегистрировать пользователя и роль

    services.AddDefaultIdentity<AppUser>()
        .AddRoles<AppRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();
    
    services.AddIdentityServer()                
        .AddApiAuthorization<AppUser, ApplicationDbContext>();
    
  6. Удалить существующее Migrations (если база данных существует, вам может потребоваться удалить ее).

  7. Запустите add-migration и update-database, чтобы проверить результат.

В настоящее время вам нужно настроить ApiAuthorizationDbContext, эта проблема была отслежена через ApiAuthorizationDbContext заставляет TUser расширять IdentityUser вместо IdentityUser # 9548 и Добавить поддержку IdentityUser в ApiAuthorizationDbContext # 13064 . Получение новой версии будет с некоторой задержкой.

...