ASP .NET Core标识自定义ApiAuthorizationDbContext [英] ASP .NET Core Identity custom ApiAuthorizationDbContext
问题描述
我正在通过Angular项目使用ASP .NET Core 3.0。我看到了这个新的 ApiAuthorizationDbContext
,我想覆盖表名和用户ID(以int表示),但是没有办法。
I'm working with ASP .NET 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?
这是上下文重写表名称的类,但是它创建了 AspNetUser
和 User
表。为什么它不照常创建一个呢?
This is the class for the context to override the table name but it creates AspNetUser
and User
table. Why doesn't it 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"); });
}
}
这是我的用户:
public class AppUser : IdentityUser
{
}
通常,我会使用 AppUser< int>
覆盖主键,但是由于 ApiAuthorizationDbContext
而无法正常工作。
Normaly I override the primary key with AppUser<int>
but it doesn't work because of the ApiAuthorizationDbContext
.
有什么想法吗?
推荐答案
用于自定义具有 ApiAuthorizationDbContext
,您可以按照以下步骤操作:
For custom the user and role tables with ApiAuthorizationDbContext
, you could follow steps below:
- 创建具有身份的Asp.Net核心角度模板
-
添加用户和角色类
- Create an Asp.Net Core Angular Template with Identity
Add User and Role 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"); });
}
}
注册用户和角色
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).
运行add-migration和update-database来检查结果。
Run add-migration and update-database to check the result.
当前,您需要自定义 ApiAuthorizationDbContext
,此问题已通过 ApiAuthorizationDbContext强制TUser扩展IdentityUser而不是IdentityUser#9548 和将IdentityUser支持添加到ApiAuthorizationDbContext#13064 。获取neweast版本会有些延迟。
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.
这篇关于ASP .NET Core标识自定义ApiAuthorizationDbContext的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!