暴露用户在身份中的角色

问题描述 投票:0回答:1

我有一个使用 dotnet 6 的 api 项目。 我使用身份,这是我的用户和角色类:

    public class ApplicationUser : IdentityUser<int> {
        public virtual ICollection<IdentityUserRole<int>> Roles { get; } = new List<IdentityUserRole<int>>();        
    }
    public class ApplicationRole : IdentityRole<int> {
        public virtual ICollection<IdentityUserRole<int>> Users { get; } = new List<IdentityUserRole<int>>();
    }

由此得出下表:

    migrationBuilder.CreateTable(
        name: "AspNetUserRoles",
        schema: "ancid",
        columns: table => new
        {
            UserId = table.Column<int>(type: "int", nullable: false),
            RoleId = table.Column<int>(type: "int", nullable: false)
        },
        constraints: table =>
        {
            //...
        });

从这里我可以从

ApplicationUser
导航到
IdentityUserRole<int>
。那就是我可以获得RoleId。 如果我想要角色名称,我必须将导航属性添加到
IdentityUserRole<int>
。这导致:

    public class ApplicationUserRole : IdentityUserRole<int> {
        public virtual ApplicationUser User { get; }
        public virtual ApplicationRole Role { get; }
    }
    public class ApplicationUser : IdentityUser<int> {
        public virtual ICollection<ApplicationUserRole> Roles { get; } = new List<ApplicationUserRole>();        
    }
    public class ApplicationRole : IdentityRole<int> {
        public virtual ICollection<ApplicationUserRole> Users { get; } = new List<ApplicationUserRole>();
    }

但是我得到了以下迁移(当然我在上下文中编辑了

OnModelCreating
方法):

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AddColumn<string>(
            name: "Discriminator",
            schema: "ancid",
            table: "AspNetUserRoles",
            type: "nvarchar(max)",
            nullable: false,
            defaultValue: "");
    }

从这里我想,好吧,

IdentityUserRole<int>
已经在上下文中映射了,让我们从新的迁移开始:删除迁移目录并从头开始重新应用迁移......:

    migrationBuilder.CreateTable(
        name: "AspNetUserRoles",
        schema: "ancid",
        columns: table => new
        {
            UserId = table.Column<int>(type: "int", nullable: false),
            RoleId = table.Column<int>(type: "int", nullable: false),
            Discriminator = table.Column<string>(type: "nvarchar(max)", nullable: false)
        },
        constraints: table =>
        {
            //...
        });

当我的代码中没有使用

IdentityUserRole<int>
时,我会得到一个鉴别器列。

请注意,

AspNetUsers
AspNetRoles
表中都没有鉴别器列。

那么我该怎么做才能在没有鉴别器列的情况下获取导航属性?

asp.net-core entity-framework-core asp.net-identity
1个回答
0
投票

可能有点晚了,但我也面临这个问题。为了解决这个问题,我们需要做一些事情(我将显示

Guid
,但你可以将它们全部更改为
int
):

  1. 使用带有所有重载的基类作为上下文:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid, IdentityUserClaim<Guid>, ApplicationUserRole, IdentityUserLogin<Guid>, IdentityRoleClaim<Guid>, IdentityUserToken<Guid>>
  1. 创建
    ApplicationUserRole
    类如下:
public class ApplicationUserRole : IdentityUserRole<Guid>
{
    public ApplicationUser User { get; set; }
    public ApplicationRole Role { get; set; }
}
  1. 使用流畅的 API 配置它(我更喜欢创建单独的类进行配置):
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

class ApplicationUserRoleConfiguration : IEntityTypeConfiguration<ApplicationUserRole>
{
    public void Configure(EntityTypeBuilder<ApplicationUserRole> builder)
    {
        builder.HasOne(t => t.User)
            .WithMany()
            .HasForeignKey(t => t.UserId);

        builder.HasOne(t => t.Role)
            .WithMany()
            .HasForeignKey(t => t.RoleId);
    }
}

要应用它们,只需覆盖您中的

OnModelCreating
即可使用
ApplicationContext
ApplyConfigurationsFromAssembly

或者直接将配置放到这个方法中。

要向导航属性公开任何其他成员,请使用相同的技术 - 更改基本继承中的类,使用公开的导航属性从原始类继承,使用流畅的 api 为它们配置映射。

在这一点上,创建新的迁移不会以任何方式更改数据库。在 .NET 8 上测试。

© www.soinside.com 2019 - 2024. All rights reserved.