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

时间:2017-02-12 14:41:09

标签: c# asp.net asp.net-core .net-core

我找到this answer但它似乎不适合我的ASP Net Core项目。

我想要了解的事情:

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

3 个答案:

答案 0 :(得分:18)

您可以通过在启动类中创建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");

            }
       }
    }

然后您可以从Startup类中的await CreateRoles(serviceProvider);方法调用Configure方法。 确保IServiceProvider类中有Configure作为参数。

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

答案 1 :(得分:2)

添加到Temi's answerXavier's comment to it,我使用的经验略有不同。

为了实现这一点,我必须添加IServiceProvider作为Configure方法的参数来获取它的实例。

public void Configure(
    IApplicationBuilder App,
    IHostingEnvironment Env,
    ILoggerFactory LoggerFactory,
    IServiceProvider ServiceProvider
)
{
    /* trimmed */

    CreateRoles(ServiceProvider).Wait();
}

答案 2 :(得分:1)

除了Temi的详细答案外,请记住替换

 services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<DbContext>();

使用

 services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<DbContext>();

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

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

 var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
 var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();

要注意的另一重要事项是,由于CreateRoles(IServiceProvider)(根据Temi的回答)是一个异步方法,因此要在Configure方法中调用它(返回void),则可以使用 CreateRoles(serviceProviderInstance).Wait(); 希望这会有所帮助。