用户角色播种失败

Posted

技术标签:

【中文标题】用户角色播种失败【英文标题】:UserRoles seeding failed 【发布时间】:2021-07-10 21:07:14 【问题描述】:

我正在开发一个 ASP.NET Core MVC Web 应用程序。我使用 Identity UI 框架进行用户授权和身份验证。

我已将所有 Identity 表的主键更改为“int”值(默认为字符串类型)

在以下代码中,我尝试将预定义的用户角色设置为“SuperAdmin”、“Admin”、“Businessman”和“WaterEnthusiast”,如下所示:

using Microsoft.AspNetCore.Identity;
using System.Linq;
using System.Threading.Tasks;
using WATERrhythmWeb.Models;

namespace WATERrhythmWeb.Data

    public class ContextSeed
    
        public static async Task SeedRolesAsync(UserManager<WaterrhythmUser> userManager, RoleManager<IdentityRole> roleManager)
        
            //Seed Roles
            await roleManager.CreateAsync(new IdentityRole(Enums.Roles.SuperAdmin.ToString()));
            await roleManager.CreateAsync(new IdentityRole(Enums.Roles.Admin.ToString()));
            await roleManager.CreateAsync(new IdentityRole(Enums.Roles.Businessman.ToString()));
            await roleManager.CreateAsync(new IdentityRole(Enums.Roles.WaterEnthusiast.ToString()));
        
    

以下是枚举:

public enum Roles

    SuperAdmin,
    Admin,
    Businessman,
    WaterEnthusiast

以下是我的 DBContext 类:

public partial class ApplicationDbContext : IdentityDbContext<WaterrhythmUser, IdentityRole<int>, int, IdentityUserClaim<int>, IdentityUserRole<int>, IdentityUserLogin<int>, IdentityRoleClaim<int>, IdentityUserToken<int>>

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    
    
    protected override void OnModelCreating(ModelBuilder builder)
    
        base.OnModelCreating(builder);
        builder.HasDefaultSchema("Identity");
        modelBuilder.Entity<WaterrhythmUser>(entity =>
        
            entity.ToTable(name: "User");
        );
        modelBuilder.Entity<IdentityRole>(entity =>
        
            entity.ToTable(name: "WATERrhythmRole");
        );
        modelBuilder.Entity<IdentityUserRole<int>>(entity =>
        
            entity.ToTable("WATERrhythmUserRoles");
        );

        modelBuilder.Entity<IdentityUserClaim<int>>(entity =>
        
            entity.ToTable("WATERrhythmUserClaims");
        );

        modelBuilder.Entity<IdentityUserLogin<int>>(entity =>
        
            entity.ToTable("WATERrhythmUserLogins");
        );

        modelBuilder.Entity<IdentityRoleClaim<int>>(entity =>
        
            entity.ToTable("WATERrhythmRoleClaims");

        );

        modelBuilder.Entity<IdentityUserToken<int>>(entity =>
        
            entity.ToTable("WATERrhythmUserTokens");
        );
    

我遵循了这个教程:https://codewithmukesh.com/blog/user-management-in-aspnet-core-mvc/

根据教程,经过上述修改后,当我运行应用程序时,上面定义的用户角色应该在数据库表中播种:'IdentityRole'。

但当我运行应用程序(已创建迁移并更新新数据库)时,它不会创建任何用户角色。

有人可以告诉我如何纠正这个问题吗?

谢谢。

(如您所见,我已将这些表的主键更改为“int”。我很好奇它是否会导致此问题。)

【问题讨论】:

【参考方案1】:

但是当我运行应用程序(已创建迁移并更新新数据库)时,它不会创建任何用户角色。

听起来您可能忘记在任何地方调用SeedRolesAsync

如果不是这样,我看到了一些可能会引起一些麻烦的事情。在您的配置中,您正在为 IdentityRole 进行配置,但在 DbContext 中,您有 IdentityRole&lt;int&gt;。即使在您的播种方法中,也没有&lt;int&gt;,而是默认IdentityRole。您应该将每个IdentityRole 更改为IdentityRole&lt;int&gt;

但是,我认为为此类字典表播种的更清洁的解决方案是使用 EF Core 的流式 API 的 HasData。在您的情况下,它可能看起来像这样:

modelBuilder.Entity<IdentityRole<int>>(entity =>

    entity.ToTable(name: "WATERrhythmRole");
    entity.HasData(
        new IdentityRole<int>
        
            Id = 1,
            Name = Roles.SuperAdmin.ToString(),
            NormalizedName = Roles.SuperAdmin.ToString().ToUpper()
        ,
        new IdentityRole<int>
        
            Id = 2,
            Name = Roles.Admin.ToString(),
            NormalizedName = Roles.Admin.ToString().ToUpper()
        
    );
);

这样就没有理由创建一个额外的方法并从某个地方运行它来为数据库播种。

【讨论】:

是的,你是对的。通过将 IdentityRole 更改为 IdentityRole,它解决了这个问题。非常感谢您的明确解释。 (我已经在我的 program.cs 中调用了调用 SeedRolesAsync。)

以上是关于用户角色播种失败的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Identity ASP.NET Core 通过代码优先迁移为用户和角色播种

如何在我的 asp.net core 3.1 应用程序中播种用户和角色?

c# - 在注册时向身份用户添加角色失败,外键约束

如何在 EF Core 2.1.0 中播种管理员用户?

Java 版本“1.7.0_79”的 SSL 握手失败

psql:致命:用户的 PAM 身份验证失败