繁体   English   中英

ASP .NET 核心标识自定义 ApiAuthorizationDbContext

[英]ASP .NET Core Identity custom ApiAuthorizationDbContext

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

这是用于覆盖表名的上下文的 class,但它会创建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<int>覆盖主键,但由于ApiAuthorizationDbContext它不起作用。

有任何想法吗?

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

  1. 创建带有标识的 Asp.Net Core Angular 模板
  2. 添加用户和角色 Class

     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 跟踪此问题以扩展 IdentityUser 而不是 IdentityUser #9548并将IdentityUser 支持添加到 ApiAuthorizationDbContext #13064 获得新东方版本会有些延迟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM