如何将自定义角色添加到ASP.NET Core

Xav*_*eña 10 c# asp.net .net-core asp.net-core

我找到了这个答案,但它似乎不适合我的ASP Net Core项目.

我想要了解的事情:

  • 如何添加自定义角色.我甚至直接看了我的MySQL数据库(表aspnetroles),但我不知道该用什么作为IdConcurrencyStamp.
  • 我在哪里放置代码以使用这些新角色为数据库设定种子:in Startup?在Register下面AccountController
  • 如何将此新角色绑定到用户?我甚至看过表格,我不知道如何分配数据(没有user2roleaspnetusers.role_id).

Tem*_*oke 22

您可以通过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");

            }
       }
    }
Run Code Online (Sandbox Code Playgroud)

然后你可以await CreateRoles(serviceProvider);ConfigureStartup类中的方法调用该方法.确保您拥有该类中IServiceProvider的参数Configure.

编辑:如果您使用的是ASP.NET核心2.x,我的文章提供了非常详细的体验. 这里

  • 就是这样,非常感谢你.将其标记为已回答.只是一个简单的说明,因为有一些步骤对我来说并不简单(如果它可以帮助其他人):为了从`Configure`方法的底部调用你的函数,我这样做:`var serviceProvider = app.ApplicationServices.GetService <IServiceProvider>(); CreateRoles(的ServiceProvider).Wait();`. (13认同)

elf*_*ico 6

除了temi的详细回答,记得替换

 services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<DbContext>();
Run Code Online (Sandbox Code Playgroud)

 services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<DbContext>();
Run Code Online (Sandbox Code Playgroud)

另外,请确保中指定AddIdentity<>的类型与中调用的类型相同serviceProvider.GetRequiredService<>

对于上述情况,我们serviceProvider.GetRequiredService<>在 Configure.cs 中调用的类型将是

 var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
 var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
Run Code Online (Sandbox Code Playgroud)

另一件需要注意的重要事情是,由于CreateRoles(IServiceProvider)(来自 Temi 的回答)是一个异步方法,要在Configure方法中调用它(返回 void),您可以使用 CreateRoles(serviceProviderInstance).Wait(); Hope 这有帮助。