web-dev-qa-db-ja.com

Asp.NetコアMVC6Identity3で最初に役割を追加する方法

Stackoverflowでこれを探しましたが、これまでのところ、Identity 12 に役割を追加することについて多くの質問があるようですが、Identity3では異なります。

データベースにロールをシードしたい。私は2つだけ持っています。クラスに注入した_roleManagerを使用するつもりでした。それはいいです。私の問題は..実際にロールを追加する方法がないようです..CreateAsyncを使用するのは、ユーザーをロールに追加するためです..「_ userManager」を使用してロールを追加するためのコーディング方法またはそれを行う必要がありますか別の方法?

7
si2030

[〜#〜]編集[〜#〜]

アイデンティティ

IdentityRoleManagerはロールを作成するためのもので、UserManagerはユーザーをロールに追加するためのものです。これはあなたを正しい方向に向ける例です。以下のコードは、新しいロールを作成するためのものですAdministrator

if (!roleManager.RoleExists("Administrator"))
            {
                MyIdentityRole newRole = new MyIdentityRole("Administrator", "Administrators can do something with data");
                roleManager.Create(newRole);
            }  

[〜#〜]編集[〜#〜]

さらに、これはユーザーをロールに追加するためのものであり、これも例です。

 \\assuming you test if the user has been assigned to the role "Administrator" before adding them to that role

 if(RoleAdministrator == true){
           userManager.AddToRole(User.Id, "Administrator");
       }
7
jamiedanq
public class SeedData
{
    private const string _adminRoleName = "admin";
    private string _adminEmail = "[email protected]";
    private string _adminPassword = "P@ssw0rd!PK";

    private string[] _roles = new string[] { _adminRoleName, "supervisor" };

    private readonly RoleManager<IdentityRole<Guid>> _roleManager;
    private readonly UserManager<ApplicationUser> _userManager;

    public  static async Task Run(IServiceProvider serviceProvider)
    {
        using (var serviceScope =serviceProvider
                                 .GetRequiredService<IServiceScopeFactory>()
                                 .CreateScope())
        {
            var instance = serviceScope.ServiceProvider.GetService<SeedData>();
            await instance.Initialize();

            var context = serviceScope.ServiceProvider.GetService<AppDbContext>();
            if (!context.Products.Any())
            {
               // Seed Other entities Here
            }

            await context.SaveChangesAsync();
        }
    }

    public SeedData(UserManager<ApplicationUser> userManager, 
                                  RoleManager<IdentityRole<Guid>> roleManager)
    {
        _roleManager = roleManager;
        _userManager = userManager;
    }

    public async Task Initialize()
    {
        foreach (var role in _roles)
        {
            if (!await _roleManager.RoleExistsAsync(role))
            {
                await _roleManager.CreateAsync(new IdentityRole<Guid>(role));
            }
        }

        var adminUsers = await _userManager.GetUsersInRoleAsync(_adminRoleName);
        if (!adminUsers.Any())
        {
            var adminUser = new ApplicationUser()
            {
                Id = Guid.NewGuid(),
                Email = _adminEmail,
                UserName = _adminEmail
            };

            var result = await _userManager.CreateAsync(adminUser, _adminPassword);
            if(result.Success)
            {
               await _userManager.AddToRoleAsync(adminUser, _adminRoleName);
            }
       }         
   }
}

Program.cs内

public static void Main(string[] args)
{
     var Host = BuildWebHost(args);

     using (var scope = Host.Services.CreateScope())
     {
         var services = scope.ServiceProvider;
         try
         {
              SeedData.Run(services).Wait();
         }
         catch (Exception ex)
         {
             var logger = services.GetRequiredService<ILogger<Program>>();
             logger.LogError(ex, "Error while seeding database.");
         }
     }

      Host.Run();
  }

誰かに役立つかもしれません:)

0
dnxit