gpt4 book ai didi

c# - 如何在 Identity ASP.NET Core 2.1(Identity Scaffolded)中播种用户角色

转载 作者:太空宇宙 更新时间:2023-11-03 22:40:06 24 4
gpt4 key购买 nike

当身份被构建时,我如何植入“管理员”用户角色?

我想通过电子邮件找到我的高级用户帐户并设置管理员角色。我找到的大多数示例都使用 Startup.cs,但您应该使用 IdentityHostingStartup.cs 来注册与身份相关的服务。

那么在哪里/如何在 IdentityHostingStartup 中注入(inject) RoleManagerUserManager? (我想这就是我需要的,如果有更好的方法请告诉我)

  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;
});
});
}
}

最佳答案

您不能在 Web 主机 builder 上执行数据播种,因为那时服务提供商尚未构建。相反,您必须先实际创建虚拟主机,然后才能解析之前注册的任何服务。

我通常的建议是在创建 WebHost 之后在 Program.cs 中执行初始播种。按照默认模板,我会将 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();
}

所以这将首先创建 web 主机,然后它将创建一个依赖注入(inject)范围,它将从中解析一个 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 将在依赖注入(inject)容器中注册。然后它可以将 RoleManager 和其他服务(例如选项,甚至数据库上下文)作为依赖项,并在 EnsureSeedDataAsync 方法中执行播种。

另一种方法是使用 Entity Framework Core data seeding functionality在模型构建器上使用 .HasData() 方法调用。然而,这需要角色对象的固定 ID,并且您还必须在数据库级别创建对象,而不是依赖更高级别的 RoleManager

关于c# - 如何在 Identity ASP.NET Core 2.1(Identity Scaffolded)中播种用户角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com