Możesz to łatwo zrobić, tworząc CreateRoles
w Twojej klasie startowej. Pomaga to sprawdzić, czy role zostały utworzone, i tworzy role, jeśli nie są; podczas uruchamiania aplikacji. Tak.
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");
}
}
}
a potem możesz wywołać await CreateRoles(serviceProvider);
metoda z Configure
w klasie Startup. Upewnij się, że masz IServiceProvider
jako parametr w Configure
klasa.
Edycja:Jeśli używasz ASP.NET core 2.x, mój artykuł tutaj zawiera bardzo szczegółowe doświadczenie.tutaj
Oprócz szczegółowej odpowiedzi Temi pamiętaj o zastąpieniu
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<DbContext>();
Z
services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<DbContext>();
Upewnij się również, że typy określone w AddIdentity<>
jest taki sam jak typy wywołane w serviceProvider.GetRequiredService<>
W powyższym przypadku nasze typy są wywoływane w serviceProvider.GetRequiredService<>
w Configure.cs byłoby
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
Inną ważną rzeczą do zapamiętania jest to, że od CreateRoles(IServiceProvider)
(z odpowiedzi Temi) to metoda asynchroniczna, aby wywołać ją w Configure
metoda (która zwraca void), możesz użyćCreateRoles(serviceProviderInstance).Wait();
Mam nadzieję, że to pomoże.
Dodając do odpowiedzi Temi i komentarza Xaviera, moje doświadczenie z tym było trochę inne przy użyciu asp.net-core-2.
Aby to zadziałało, musiałem dodać IServiceProvider
jako parametr Configure
metoda, aby uzyskać jego instancję.
public void Configure(
IApplicationBuilder App,
IHostingEnvironment Env,
ILoggerFactory LoggerFactory,
IServiceProvider ServiceProvider
)
{
/* trimmed */
CreateRoles(ServiceProvider).Wait();
}