ASP .NET 核心身份自定义 ApiAuthorizationDbContext
ASP .NET Core Identity custom ApiAuthorizationDbContext
我正在使用 ASP .NET Core 3.0 和 Angular 项目。我看到这个新的 ApiAuthorizationDbContext
,我想覆盖 table 名称和用户 ID(到 int),但我无法做到。有人知道诀窍吗?
这是覆盖 table 名称的上下文的 class,但它会创建 AspNetUser
和 User
table。为什么它不像往常一样创建一个?
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
自定义用户和角色表,您可以按照以下步骤操作:
- 创建一个 Asp.Net 具有身份的 Angular 核心模板
添加用户和角色Class
public class AppUser : IdentityUser<int>
{
}
public class AppRole : IdentityRole<int>
{
}
添加自定义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)
{
}
}
改变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"); });
}
}
注册用户和角色
services.AddDefaultIdentity<AppUser>()
.AddRoles<AppRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddIdentityServer()
.AddApiAuthorization<AppUser, ApplicationDbContext>();
删除现有的Migrations
(如果数据库存在,您可能需要删除它)。
运行 添加迁移和更新数据库查看结果。
目前,您需要自定义 ApiAuthorizationDbContext
,此问题已通过 ApiAuthorizationDbContext force TUser to extends IdentityUser instead of IdentityUser #9548 and Add IdentityUser support to ApiAuthorizationDbContext #13064 跟踪。获取neweast版本会有些延迟。
我正在使用 ASP .NET Core 3.0 和 Angular 项目。我看到这个新的 ApiAuthorizationDbContext
,我想覆盖 table 名称和用户 ID(到 int),但我无法做到。有人知道诀窍吗?
这是覆盖 table 名称的上下文的 class,但它会创建 AspNetUser
和 User
table。为什么它不像往常一样创建一个?
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
自定义用户和角色表,您可以按照以下步骤操作:
- 创建一个 Asp.Net 具有身份的 Angular 核心模板
添加用户和角色Class
public class AppUser : IdentityUser<int> { } public class AppRole : IdentityRole<int> { }
添加自定义
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) { } }
改变
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"); }); } }
注册用户和角色
services.AddDefaultIdentity<AppUser>() .AddRoles<AppRole>() .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddIdentityServer() .AddApiAuthorization<AppUser, ApplicationDbContext>();
删除现有的
Migrations
(如果数据库存在,您可能需要删除它)。运行 添加迁移和更新数据库查看结果。
目前,您需要自定义 ApiAuthorizationDbContext
,此问题已通过 ApiAuthorizationDbContext force TUser to extends IdentityUser instead of IdentityUser #9548 and Add IdentityUser support to ApiAuthorizationDbContext #13064 跟踪。获取neweast版本会有些延迟。