【问题标题】:Custom Roles class for ApiAuthorizationDbContextApiAuthorizationDbContext 的自定义角色类
【发布时间】:2020-11-29 21:19:58
【问题描述】:

在过去的 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 类中找不到这种支持。

谢谢。

【问题讨论】:

标签: asp.net-core entity-framework-core identityserver4 asp.net-core-3.1 blazor-webassembly


【解决方案1】:

我没有找到一种方法来拥有我的自定义角色类,但我找到了一种方法来解决我的问题并将属性添加到现有的 IdentityRole 类中,并且会回答我的问题,以防其他人需要做类似的事情。这个问题的解决方案是阴影属性。

例如,如果我想为 IdentityRole 类创建一个 DateTime 属性,我们可以在 DBContext 类中使用以下代码。

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<IdentityRole>().Property<DateTime>("LastUpdated");
    base.OnModelCreating(builder);
}

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

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

这不像拥有自定义类那么容易,但至少它让我有机会拥有 IdentityRole 类的自定义属性。

【讨论】:

【解决方案2】:

来自@javiercn

ApiAuthorizationDbContext 是一个方便您入门的类。

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 中添加角色的完整示例:

https://stackoverflow.com/a/71321924/3850405

【讨论】:

    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 2015-05-29
    • 2018-03-10
    • 1970-01-01
    • 2015-01-09
    • 2020-09-05
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多