C# 如何向ASP.NET核心添加自定义角色

C# 如何向ASP.NET核心添加自定义角色,c#,asp.net,asp.net-core,.net-core,asp.net-core-2,C#,Asp.net,Asp.net Core,.net Core,Asp.net Core 2,我已经找到了,但它似乎不适合我的ASP Net核心项目 我想了解的事情: 如何添加自定义角色。我甚至直接查看了MySQL数据库(表aspnetroles),但我不知道作为Id和ConcurrencyStamp使用什么 我应该将代码放在哪里,以便为数据库添加这些新角色:在Startup中?在会计控制器下的注册 如何将此新角色绑定到用户?我甚至浏览了表格,不知道如何分配数据(没有user2role或aspnetusers.role\u id) 您可以通过在startup类中创建一个CreateRo

我已经找到了,但它似乎不适合我的ASP Net核心项目

我想了解的事情:

  • 如何添加自定义角色。我甚至直接查看了MySQL数据库(表
    aspnetroles
    ),但我不知道作为
    Id
    ConcurrencyStamp
    使用什么
  • 我应该将代码放在哪里,以便为数据库添加这些新角色:在
    Startup
    中?在
    会计控制器下的
    注册
  • 如何将此新角色绑定到用户?我甚至浏览了表格,不知道如何分配数据(没有
    user2role
    aspnetusers.role\u id

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

            }
       }
    }
专用异步任务CreateRoles(IServiceProvider服务提供者)
{
//添加海关角色:问题1
var rolemager=serviceProvider.GetRequiredService();
var UserManager=serviceProvider.GetRequiredService添加到和中,我使用它的经验有点不同

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

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

    CreateRoles(ServiceProvider).Wait();
}

除了特米的详细回答外,请记住替换

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

services.AddIdentity().AddEntityFrameworkStores();
另外,请确保在
AddIdentity
中指定的类型与在
serviceProvider.GetRequiredService
中调用的类型相同

对于以上内容,我们在Configure.cs中的
serviceProvider.GetRequiredService
中调用的类型是

 var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
 var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
var rolemager=serviceProvider.GetRequiredService();
var userManager=serviceProvider.GetRequiredService();
另一个需要注意的重要事项是,由于
CreateRoles(IServiceProvider)
(来自Temi的答案)是一个异步方法,所以要在
Configure
方法(返回void)中调用它,您可以使用
CreateRoles(serviceProviderInstance).Wait();

希望这有帮助。

看起来不错!我会在回家后尝试实现它,我会在代码中测试它后立即将其标记为“已回答”。关于“我将代码放在哪里”:我想我应该在
Startup.cs
中的
Configure
方法的末尾调用它。谢谢,Xavier。是的,你可以在
Configure
方法的末尾调用它。在配置路由之后立即调用。就是这样,非常感谢。将它标记为已回答。只是一个简短的说明,因为有一些步骤不是琐碎的或者我(如果它可以帮助其他人):为了从
Configure
方法的底部调用您的函数,我这样做了:
var serviceProvider=app.ApplicationServices.GetService();CreateRoles(serviceProvider).Wait();
。要在
Configure
方法末尾调用函数,只需像
CreateRoles(serviceProvider)一样执行。等待();
,但请确保
Configure
方法的参数为
IServiceProvider serviceProvider
。例如:
Configure(/*其他参数*/,IServiceProvider serviceProvider)
@temilajumoke-你的链接断开了。404.我希望我能在自己解决问题之前读到这篇文章
 var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
 var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();