web-dev-qa-db-ja.com

ASP.NET Coreにカスタムロールを追加する方法

私は この答え を見つけましたが、私のASP Net Coreプロジェクトには適合しません。

私が理解しようとしていること:

  • カスタムロールを追加するにはどうすればよいですか。 MySQLデータベース(テーブルaspnetroles)を直接調べたこともありますが、IdおよびConcurrencyStampとして何を使用するかわかりません。
  • これらの新しいロールをデータベースにシードするコードをどこに配置しますか:Startup内? RegisterAccountControllerの下
  • この新しいロールをユーザーに関連付けるにはどうすればよいですか?テーブルを調べても、データの割り当て方法がわかりません(user2roleまたはaspnetusers.role_idはありません)。
11
Xavier Peña

これは、スタートアップクラスに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クラスのConfigureメソッドからawait CreateRoles(serviceProvider);メソッドを呼び出すことができます。 IServiceProviderクラスのパラメーターとしてConfigureがあることを確認してください。

編集:ASP.NETコア2.xを使用している場合、ここでの記事は非常に詳細なエクスペリエンスを提供します。 ここ

24
Temi Lajumoke

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();を使用できることに注意してください。お役に立てれば。

5
elfico

Temiの回答 および Xavierのコメント に追加すると、これに関する私の経験は asp.net-core-2 を使用した場合とは少し異なりました。

これを機能させるには、IServiceProviderメソッドのパラメーターとしてConfigureを追加して、そのインスタンスを取得する必要がありました。

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

    CreateRoles(ServiceProvider).Wait();
}
3
derpasaurus