问题
I'm working with aspnet core 3.0 with angular project. I see this new ApiAuthorizationDbContext and I wanted to override the table name and user id (to int) but there is no way I can do it. Does any body know a trick?
- This is the class for the context where I tell him to override the table name but it create AspNetUser and User table ! why doesn't just create one as usual
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"); });
}
}
- Here is my user
public class AppUser : IdentityUser
{
}
- Normaly I override te primary key with AppUser but it doesn't work becouse of the ApiAuthorizationDbContext.
Anybody any idea?
回答1:
For custom the user and role tables with ApiAuthorizationDbContext, you could follow steps below:
- Create an Asp.Net Core Angular Template with Identity
Add User and Role Class
public class AppUser : IdentityUser<int> { } public class AppRole : IdentityRole<int> { }Add custom
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) { } }Change
DbContextpublic 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"); }); } }Register user and role
services.AddDefaultIdentity<AppUser>() .AddRoles<AppRole>() .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddIdentityServer() .AddApiAuthorization<AppUser, ApplicationDbContext>();Delete existing
Migrations(if database exist, you may need to delete it).Run add-migration and update-database to check the result.
Currently, you need to custom ApiAuthorizationDbContext, this issue has been tracked through ApiAuthorizationDbContext force TUser to extends IdentityUser instead of IdentityUser #9548 and Add IdentityUser support to ApiAuthorizationDbContext #13064. It will be some delay to get the neweast version.
来源:https://stackoverflow.com/questions/58208894/aspnet-core-identity-custom-apiauthorizationdbcontext