Я работаю над проектом, использую подход, основанный на коде, и использую ASP .NET Core 3.0 и Entity Framework Core & Identity 3.0.0. Я определил свои права и хотел бы создать два IdentityRoles
, один как Customer
, а другой как Administrator
. Для этого я подготовил следующий метод:
public static IServiceProvider ConfigureDefaultRoles(this IServiceProvider serviceProvider)
{
//TODO: figure out why the table is incorrectly named
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole<Guid>>>();
var defaultUserRoles = new List<IdentityRole<Guid>>
{
new IdentityRole<Guid>() {Name = UserRoleDefinitions.CustomerRoleName},
new IdentityRole<Guid>() {Name = UserRoleDefinitions.AdministratorRoleName}
};
foreach (var role in defaultUserRoles)
{
if (roleManager.RoleExistsAsync(role.Name).Result)
{
continue;
}
roleManager.CreateAsync(role);
}
return serviceProvider;
}
Этот метод вызывается Startup
следующим образом:
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
app.ConfigureApplication();
serviceProvider.ConfigureDefaultRoles();
}
При запуске это приводит к следующему ошибка . Основная проблема заключается в том, что менеджер ролей пытается запросить таблицу AspNetRoles
вместо AspNetUserRoles
. Я убедился, что миграции были применены. Мой контекст БД выглядит следующим образом:
public class ApplicationDbContext : IdentityDbContext<User, IdentityRole<Guid>, Guid>, IDbContext
{
/// <summary>
/// Constructor
/// </summary>
/// <param name="options">The options for the application context builder</param>
public ApplicationDbContext(DbContextOptions options)
: base(options)
{
}
/// <summary>
/// Apply the entity configurations defined in 'Configurations'.
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Call the base
base.OnModelCreating(modelBuilder);
// Apply the configurations defined in 'Configurations'
modelBuilder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly);
}
}
В этом проекте нет реализованных ролей, я использую IdentityRole<Guid>
. Идентификация настраивается следующим образом:
public static IServiceCollection ConfigureIdentity(this IServiceCollection services)
{
services
.AddIdentity<User, IdentityRole<Guid>>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
return services;
}
Мой User
выглядит следующим образом: User : IdentityUser<Guid>
. Кроме того, я взглянул на ApplicationDbContextModelSnapshot
и заметил, что действительно таблица AspNetRoles
объявлена как использующая именованную ошибку, которой нет, но таблица перестроена под именем AspNetUserRoles
. Изучение файла базы данных (app.db
для разработки) показывает только AspNetUserRoles
. Полный снимок доступен здесь .
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole<System.Guid>", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("TEXT");
b.Property<string>("Name")
.HasColumnType("TEXT")
.HasMaxLength(256);
b.Property<string>("NormalizedName")
.HasColumnType("TEXT")
.HasMaxLength(256);
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasName("RoleNameIndex");
b.ToTable("AspNetRoles");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<System.Guid>", b =>
{
b.Property<Guid>("UserId")
.HasColumnType("TEXT");
b.Property<Guid>("RoleId")
.HasColumnType("TEXT");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles");
});
Очевидно, мне не хватает точки ..
Спасибо!