如何添加管理员角色(我的解决方案)

How to add Admin role ( My solution )

我找不到任何可行的解决方案...我尝试了每个 google 结果。 我为此纠结了几个小时。

所以我只是将我的新角色插入到 SQL 表中:

insert into [dbo].[AspNetRoles] ( [Id]
      ,[ConcurrencyStamp]
      ,[Name]
      ,[NormalizedName] )
values(1,NULL,'Admin','Admin') ;

Insert into [dbo].[AspNetUserRoles] (  [UserId]
      ,[RoleId] )
VALUES('user_id_from_[dbo].[AspNetUsers]' , 1 )

我认为它太丑陋了,而且我能做的真的很糟糕,但它确实有效。

SO 上有一个答案被标记为解决方案:

但在 google 中寻找答案后,我真的不知道如何在 Startup.cs 中正确初始化 roleManager。

我什至不相信它真的那么难。我想我只是缺少一些线索。

通常 管理员角色 在创建模式时被植入到数据库中。您正在使用 Identity 创建或播种 Admin 角色。 Identity 使用 Code-First 方法,以便您可以尽可能多地自定义它。不要手动使用 SQL 查询。以下是您可以在运行时使用 DI 创建具有管理员权限数据的 Admin User 的方法,因为 EFCore 尚不支持对播种数据的内置支持(它将在更新中支持) .

要播种数据,请在 数据文件夹 中创建一个 class(例如 AdministratorSeedData.cs)并添加以下代码。

public class AdministratorSeedData
{
    private RoleManager<IdentityRole> _roleManager;
    private UserManager<ApplicationUser> _userManager;

    public AdministratorSeedData(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager)
    {
        _userManager = userManager;
        _roleManager = roleManager;
    }

    public async Task EnsureSeedDataAsync()
    {
        if (await _userManager.FindByEmailAsync("someone@someone.com") == null)
        {
            ApplicationUser administrator = new ApplicationUser()
            {
                UserName = "someone@someone.com",
                Email = "someone@someone.com"
            };

            await _userManager.CreateAsync(administrator, "Passw0rd123!");
            await _roleManager.CreateAsync(new IdentityRole("Administrator"));

            IdentityResult result = await _userManager.AddToRoleAsync(administrator, "Administrator");
        }
    }
}

然后在Startup.csclass中,在DI容器中注册这个服务为:

    public void ConfigureServices(IServiceCollection services)
    {
        ....
        services.AddTransient<AdministratorSeedData>();
    }

    public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, AdministratorSeedData seeder)
    {
        ....
        await seeder.EnsureSeedDataAsync();
    }

确保没有创建数据库。 运行 应用程序,您将看到具有管理员角色的用户已成功创建。