Как заполнять пользовательские роли в Identity ASP.NET Core 2.1 (Identity Scaffolded) - PullRequest
0 голосов
/ 08 октября 2018

Как я могу заполнить роль пользователя "admin", когда удостоверение защищено?

Я хотел бы найти свою учетную запись опытного пользователя по электронной почте и заполнить роль администратора.Большинство примеров, которые я нахожу, используют Startup.cs, но вы должны использовать IdentityHostingStartup.cs для регистрации служб, связанных с идентификацией.

Так где / как я могу ввести RoleManager и UserManager в IdentityHostingStartup?(Я предполагаю, что это то, что мне нужно, пожалуйста, дайте мне знать, если есть лучший способ)

  public class IdentityHostingStartup : IHostingStartup
  {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureServices((context, services) => {
                services.AddDbContext<MyWebContext>(options =>
                    options.UseSqlServer(
                        context.Configuration.GetConnectionString("MyWebContextConnection")));

                services.AddIdentity<MyWebUser, MyWebRole>()
                    .AddRoles<MyWebRole>()
                    .AddRoleManager<RoleManager<MyWebRole>>()
                    .AddDefaultUI()
                    .AddEntityFrameworkStores<MyWebContext>();

                services.Configure<IdentityOptions>(options => {
                    options.Password.RequireNonAlphanumeric = false;
                    });
            });
        }
  }

1 Ответ

0 голосов
/ 08 октября 2018

Вы не можете выполнять заполнение данных на веб-хосте builder , поскольку в то время поставщик услуг еще не был создан.Вместо этого вам придется сначала создать веб-хостинг, прежде чем вы сможете разрешить любые ранее зарегистрированные сервисы.

Моя обычная рекомендация - выполнить начальное заполнение в Program.cs после создания WebHost.,Следуя шаблону по умолчанию, я бы настроил метод Main, чтобы он выглядел следующим образом:

public static async Task Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var roleManager = scope.ServiceProvider.GetService<RoleManager<MyWebRole>>();

        if (!await roleManager.RoleExistsAsync("admin"))
            await roleManager.CreateAsync(new MyWebRole { Name = "admin" });
    }

    await host.RunAsync();
}

Таким образом, это сначала создаст веб-хост, а затем создаст область внедрения зависимостей, из которой он разрешитRoleManager экземпляр.Используя этого менеджера, вы сможете создавать нужные вам роли.

Для этого вы также можете создать отдельный сервис, поэтому вам не нужно будет располагать всей этой логикой внутри Program.cs, а просто полагаться на некоторые другие.Служба для выполнения заполнения данных:

public static async Task Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var dataSeeder = scope.ServiceProvider.GetService<DataSeeder>();
        await dataSeeder.EnsureSeedDataAsync();
    }

    await host.RunAsync();
}

Затем DataSeeder будет зарегистрирован в контейнере внедрения зависимостей.И тогда он может принять RoleManager и другие службы (например, опции или даже контекст базы данных) в качестве зависимости и выполнить заполнение в методе EnsureSeedDataAsync.

Альтернативой может быть использование Entity Framework Базовая функциональность заполнения данных с использованием вызова метода .HasData() в конструкторе моделей.Однако для этого необходимы фиксированные идентификаторы для ваших объектов роли, и вам также придется создавать объекты на уровне базы данных, а не полагаться на более высокий уровень RoleManager.

...