我找到this answer但它似乎不适合我的ASP Net Core项目。
我想要了解的事情:
aspnetroles
),但我不知道该用作Id
和ConcurrencyStamp
。Startup
?在Register
下的AccountController
?user2role
或aspnetusers.role_id
)。答案 0 :(得分:18)
您可以通过在启动类中创建CreateRoles
方法来轻松完成此操作。这有助于检查角色是否已创建,如果不是,则创建角色;在应用程序启动。像这样。
private async Task CreateRoles(IServiceProvider serviceProvider)
{
//adding customs roles : Question 1
var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
string[] roleNames = { "Admin", "Manager", "Member" };
IdentityResult roleResult;
foreach (var roleName in roleNames)
{
var roleExist = await RoleManager.RoleExistsAsync(roleName);
if (!roleExist)
{
//create the roles and seed them to the database: Question 2
roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
}
}
//Here you could create a super user who will maintain the web app
var poweruser = new ApplicationUser
{
UserName = Configuration["AppSettings:UserName"],
Email = Configuration["AppSettings:UserEmail"],
};
string userPWD = Configuration["AppSettings:UserPassword"];
var _user = await UserManager.FindByEmailAsync(Configuration["AppSettings:AdminUserEmail"]);
if(_user == null)
{
var createPowerUser = await UserManager.CreateAsync(poweruser, userPWD);
if (createPowerUser.Succeeded)
{
//here we tie the new user to the role : Question 3
await UserManager.AddToRoleAsync(poweruser, "Admin");
}
}
}
然后您可以从Startup类中的await CreateRoles(serviceProvider);
方法调用Configure
方法。
确保IServiceProvider
类中有Configure
作为参数。
编辑: 如果您正在使用ASP.NET核心2.x,我的文章提供了非常详细的体验。 here
答案 1 :(得分:2)
添加到Temi's answer和Xavier's comment to it,我使用asp.net-core-2的经验略有不同。
为了实现这一点,我必须添加IServiceProvider
作为Configure
方法的参数来获取它的实例。
public void Configure(
IApplicationBuilder App,
IHostingEnvironment Env,
ILoggerFactory LoggerFactory,
IServiceProvider ServiceProvider
)
{
/* trimmed */
CreateRoles(ServiceProvider).Wait();
}
答案 2 :(得分:1)
除了Temi的详细答案外,请记住替换
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<DbContext>();
使用
services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<DbContext>();
另外,请确保AddIdentity<>
中指定的类型与serviceProvider.GetRequiredService<>
中调用的类型相同
对于上述情况,在Configure.cs中serviceProvider.GetRequiredService<>
中调用的类型为
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
要注意的另一重要事项是,由于CreateRoles(IServiceProvider)
(根据Temi的回答)是一个异步方法,因此要在Configure
方法中调用它(返回void),则可以使用
CreateRoles(serviceProviderInstance).Wait();
希望这会有所帮助。