我在使用 Identity 进行身份验证的 .NET Core 8 Web API 项目中遇到角色管理问题。我已在 OnModelCreating 方法期间成功将角色播种到数据库,如下所示:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Seed User Roles
SeedRoles(builder);
}
private void SeedRoles(ModelBuilder builder)
{
builder.Entity<IdentityRole>().HasData(
new IdentityRole { Name = SD.Role_Admin },
new IdentityRole { Name = SD.Role_User },
new IdentityRole { Name = SD.Role_HR });
}
但是,当我尝试在控制器中使用 wait _roleManager.RoleExistsAsync(role) 检查角色是否存在时,它总是返回 false,即使角色名称存在于数据库中也是如此。
我已经验证这些角色确实已播种到数据库中。这是控制器的相关代码片段:
var roleExists = await _roleManager.RoleExistsAsync(role);
任何有关 RoleExistsAsync 为何无法识别种子角色的见解将不胜感激。
我遇到了类似的问题,并通过在播种过程中初始化 IdentityRole 对象的 NormalizedName 字段来解决它。按如下方式更新您的代码:
private void SeedRoles(ModelBuilder builder)
{
builder.Entity<IdentityRole>().HasData(
new IdentityRole { Name = SD.Role_Admin, ConcurrencyStamp = "1", NormalizedName = "ADMIN" },
new IdentityRole { Name = SD.Role_User, ConcurrencyStamp = "2", NormalizedName = "USER" },
new IdentityRole { Name = SD.Role_HR, ConcurrencyStamp = "3", NormalizedName = "HR" });
}
这可确保 NormalizedName 字段设置正确,并且 RoleExistsAsync 现在应该能够识别种子角色。