J'ai trouvé cette réponse mais cela ne semble pas correspondre à mon projet ASP Net Core.
Ce que j'essaie de comprendre:
aspnetroles
), mais je ne sais pas quoi utiliser comme Id
et ConcurrencyStamp
.Startup
? dans Register
sous AccountController
?user2role
ni aspnetusers.role_id
).Vous pouvez le faire facilement en créant une méthode CreateRoles
dans votre classe de démarrage. Cela permet de vérifier si les rôles sont créés et crée les rôles s'ils ne le sont pas. au démarrage de l'application. Ainsi.
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");
}
}
}
vous pouvez ensuite appeler la méthode await CreateRoles(serviceProvider);
à partir de la méthode Configure
de la classe Startup. vérifie que vous avez IServiceProvider
en tant que paramètre de la classe Configure
.
Edit: Si vous utilisez ASP.NET core 2.x, mon article ici fournit une expérience beaucoup plus détaillée. ici
En ajoutant à la réponse de Temi et le commentaire de Xavier à ce sujet , mon expérience en la matière était un peu différente avec asp.net-core-2 .
Pour que cela fonctionne, j'ai dû ajouter IServiceProvider
en tant que paramètre de la méthode Configure
pour en obtenir une instance.
public void Configure(
IApplicationBuilder App,
IHostingEnvironment Env,
ILoggerFactory LoggerFactory,
IServiceProvider ServiceProvider
)
{
/* trimmed */
CreateRoles(ServiceProvider).Wait();
}
En plus de la réponse détaillée de Temi, n'oubliez pas de remplacer
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<DbContext>();
Avec
services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<DbContext>();
Assurez-vous également que les types spécifiés dans AddIdentity<>
sont identiques à ceux appelés dans serviceProvider.GetRequiredService<>
Pour ce qui précède, nos types appelés dans serviceProvider.GetRequiredService<>
dans Configure.cs seraient:
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
Une autre chose importante à noter est que, puisque CreateRoles(IServiceProvider)
(de la réponse de Temi) est une méthode asynchrone, pour l'appeler dans la méthode Configure
(qui renvoie null), vous pouvez utiliser CreateRoles(serviceProviderInstance).Wait();
J'espère que cela vous aidera.