如何添加管理员角色(我的解决方案)
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.cs
class中,在DI容器中注册这个服务为:
public void ConfigureServices(IServiceCollection services)
{
....
services.AddTransient<AdministratorSeedData>();
}
和
public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, AdministratorSeedData seeder)
{
....
await seeder.EnsureSeedDataAsync();
}
确保没有创建数据库。 运行 应用程序,您将看到具有管理员角色的用户已成功创建。
我找不到任何可行的解决方案...我尝试了每个 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.cs
class中,在DI容器中注册这个服务为:
public void ConfigureServices(IServiceCollection services)
{
....
services.AddTransient<AdministratorSeedData>();
}
和
public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, AdministratorSeedData seeder)
{
....
await seeder.EnsureSeedDataAsync();
}
确保没有创建数据库。 运行 应用程序,您将看到具有管理员角色的用户已成功创建。