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

时间:2016-08-27 13:27:24

标签: asp.net asp.net-core asp.net-identity asp.net-core-1.0

我找不到任何可行的解决方案......我尝试了每个谷歌搜索结果。 我几个小时都在讨论这个问题。

所以我只需将我的新角色插入到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 )

我觉得它太难看了,而且我能做的最糟糕,但是它有效。

On SO是一个标记为解决方案的答案: Asp.Net core MVC6 How to initially add roles in Identity 3

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

我甚至不相信它真的那么难。我想我只是错过了一些线索。

1 个答案:

答案 0 :(得分:5)

通常管理员角色会在创建架构时播种到数据库中。您正在使用Identity来创建或播种管理员角色。 Identity使用Code-First方法,以便您可以尽可能地自定义它。不要手动使用SQL查询。下面是使用DI在运行时使用管理员权限数据创建管理员用户的方法,因为EFCore尚不支持对种子数据的内置支持(它将在更新中支持)。

要种子数据,在数据文件夹中创建一个类(例如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.cs类中,将此服务在DI容器中注册为:

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

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

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