Jak dodać niestandardowe role do ASP.NET Core

Jak dodać niestandardowe role do ASP.NET Core

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