web-dev-qa-db-fra.com

Comment ajouter des rôles personnalisés à ASP.NET Core

J'ai trouvé cette réponse mais cela ne semble pas correspondre à mon projet ASP Net Core.

Ce que j'essaie de comprendre:

  • Comment puis-je ajouter un rôle personnalisé? J'ai même regardé directement dans ma base de données MySQL (table aspnetroles), mais je ne sais pas quoi utiliser comme Id et ConcurrencyStamp.
  • Où dois-je placer le code pour ensemencer la base de données avec ces nouveaux rôles: dans Startup? dans Register sous AccountController?
  • Comment lier ce nouveau rôle à un utilisateur? J'ai même parcouru les tables et je ne sais pas comment assigner les données (il n'y a ni user2role ni aspnetusers.role_id).
8
Xavier Peña

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

16
Temi Lajumoke

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();
}
1
derpasaurus

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.

1
elfico