我找不到任何可行的解决方案......我尝试了每个谷歌搜索结果。 我几个小时都在讨论这个问题。
所以我只需将我的新角色插入到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。
我甚至不相信它真的那么难。我想我只是错过了一些线索。
答案 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();
}
确保没有创建数据库。运行该应用程序,您将看到已成功创建具有管理员角色的用户。