【问题标题】:ASP .NET Core Identity custom ApiAuthorizationDbContextASP .NET Core Identity 自定义 ApiAuthorizationDbContext
【发布时间】:2020-02-01 04:02:47
【问题描述】:

我正在使用带有 Angular 项目的 ASP .NET Core 3.0。我看到了这个新的ApiAuthorizationDbContext,我想覆盖表名和用户 ID(到 int),但我无法做到。有人知道技巧吗?

这是用于覆盖表名的上下文类,但它会创建 AspNetUserUser 表。为什么不像往常一样创建一个?

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&lt;int&gt; 覆盖主键,但由于ApiAuthorizationDbContext,它不起作用。

有什么想法吗?

【问题讨论】:

    标签: c# asp.net-core asp.net-identity identityserver4


    【解决方案1】:

    要使用ApiAuthorizationDbContext 自定义用户和角色表,您可以按照以下步骤操作:

    1. 使用身份创建 Asp.Net Core Angular 模板
    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 force TUser to extends IdentityUser instead of IdentityUser #9548Add IdentityUser support to ApiAuthorizationDbContext #13064跟踪。获取新东方版本会有些延迟。

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 2018-10-18
      • 1970-01-01
      • 2018-09-05
      • 2020-04-21
      • 2019-07-31
      相关资源
      最近更新 更多