ApiAuthorizationDbContext 的自定义角色 class

Custom Roles class for ApiAuthorizationDbContext

在过去的 2 天里,我一直在尝试获取 ApiAuthorizationDbContext 来设置自定义 IdentityRole。使用 IdentityDbContext 可以按如下方式完成:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

在 blazor 项目模板中,ApplicationDbContext 的声明如下:

public class ApplicationDbContext : ApiAuthorizationDbContext<ApplicationUser>
{
    public ApplicationDbContext(
        DbContextOptions options,
        IOptions<OperationalStoreOptions> operationalStoreOptions) : base(options, operationalStoreOptions)
    {
    }
}

如何使用 ApiAuthorizationDbContext 执行类似的操作。我无法从 ApiAuthorizationDbContext class.

中找到这种支持

谢谢。

我没有找到自定义角色的方法 class 但我找到了解决问题的方法并将属性添加到现有的 IdentityRole class 并且会回答我的问题以防万一其他人需要做类似的事情。解决这个问题的办法就是Shadow属性。

例如,如果我想为 IdentityRole class 创建 DateTime 属性,我们可以在 DBContext class.

中使用以下代码
protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<IdentityRole>().Property<DateTime>("LastUpdated");
    base.OnModelCreating(builder);
}

现在我们可以像这样访问 属性:

context.Entry(myRole).Property("LastUpdated").CurrentValue = DateTime.Now;

它不像拥有自定义 class 那样容易,但至少它让我有机会拥有 IdentityRole class.

的自定义属性

来自@javiercn

ApiAuthorizationDbContext is a convenience class to get you started.

https://github.com/dotnet/aspnetcore/issues/14161#issuecomment-533468760

我创建这个 ApplicationApiAuthorizationDbContext 是为了让它与角色一起工作。

//Based on Microsoft.AspNetCore.ApiAuthorization.IdentityServer.ApiAuthorizationDbContext, Version=6.0.2.0
//https://github.com/dotnet/aspnetcore/issues/14161#issuecomment-533468760
public class ApplicationApiAuthorizationDbContext<TUser, TRole> : IdentityDbContext<TUser, TRole, string>, IPersistedGrantDbContext, IDisposable where TUser : IdentityUser where TRole : IdentityRole
{
    private readonly IOptions<OperationalStoreOptions> _operationalStoreOptions;

    public DbSet<PersistedGrant> PersistedGrants
    {
        get;
        set;
    }

    public DbSet<DeviceFlowCodes> DeviceFlowCodes
    {
        get;
        set;
    }

    public DbSet<Key> Keys
    {
        get;
        set;
    }

    public ApplicationApiAuthorizationDbContext(DbContextOptions options, IOptions<OperationalStoreOptions> operationalStoreOptions)
        : base(options)
    {
        _operationalStoreOptions = operationalStoreOptions;
    }

    Task<int> IPersistedGrantDbContext.SaveChangesAsync()
    {
        return base.SaveChangesAsync();
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value);
    }
}

在 EF Core 5.0 和 EF Core 6.0 中添加角色的完整示例: