全新的 ASP.Net Core。必须使用 Identity 创建一个 asp.net core 2.2 项目(并让用户播种)。
我找不到任何有关如何准确执行此操作的文档。
我能够找到创建身份角色的代码(无论如何编译,还没有到我可以运行它的地方:
private static async Task CreateUserTypes(ApplicationDbContext authContext, IServiceProvider serviceProvider)
{
var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
string[] roleNames = { "Administrator", "Data Manager", "Interviewer", "Respondent" };
IdentityResult roleResult;
foreach (var roleName in roleNames)
{
var roleExist = await RoleManager.RoleExistsAsync(roleName);
if (!roleExist)
{
roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
}
}
}
现在,我需要创建一些用户。但是我找不到奇怪的微软语法来做到这一点(谷歌搜索了 2 天)。
这是不起作用的:
private static async Task CreateRootUser(Models.CensORContext context, ApplicationDbContext authContext, IServiceProvider serviceProvider)
{
//Create the root ADMIN user for all things admin.
UserManager<ApplicationDbContext> userManager = serviceProvider.GetRequiredService<UserManager<ApplicationDbContext>>();
IdentityUser user = new IdentityUser()
{
UserName = "admin@admin.admin",
Email = "admin@admin.admin"
};
var NewAdmin = await userManager.CreateAsync(user, "password");
}
我看到的错误是:
Argument1:无法从“Microsoft.AspNetCore.Identity.IdentityUser”转换为“ApplicationDbContext”
这是什么意思?显然,我没有合适的 userManager。但是,如何获得正确的参数,将用户作为第一个参数,将字符串(密码)作为第二个参数?
此外,Google 搜索中出现的示例有一个ApplicationUser
我没有(也不需要?)的对象。示例中未定义我如何获得它。
欧文
好的。过去的语法错误,但现在我遇到了运行时错误:
NullReferenceException:对象引用未设置为对象的实例。在调用 CreateAsync 时。这是新代码:
private static async Task CreateRootUser(Models.CensORContext context, ApplicationDbContext authContext, IServiceProvider serviceProvider)
{
//Create the root ADMIN user for all things admin.
var userStore = new UserStore<IdentityUser>(authContext);
UserManager<IdentityUser> userManager = new UserManager<IdentityUser>(userStore, null, null, null, null, null, null, serviceProvider, null);
// = serviceProvider.GetRequiredService<UserManager<ApplicationDbContext>>();
IdentityUser user = new IdentityUser()
{
UserName = "admin@admin.admin",
Email = "admin@admin.admin"
};
var result = await userManager.CreateAsync(user, "password");
}
将研究创建 userManager 的其他参数是什么以及如何从 serviceProvider 获取它们?
——欧文
想出了如何去做。关键是找到要传入的正确服务提供者以及创建 userManager 的正确语法。我通过谷歌找到的其他答案都用IdentityUser
他们自己ApplicationUser
的把水弄混了。这是工作功能(希望这对某人有所帮助):
private static async Task CreateRootUser(Models.CensORContext context, ApplicationDbContext authContext, IServiceProvider serviceProvider)
{
//Create the root ADMIN user for all things admin.
var userStore = new UserStore<IdentityUser>(authContext);
UserManager<IdentityUser> userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
//new UserManager<IdentityUser>(userStore, null, null, null, null, null, null, serviceProvider, null);
// = serviceProvider.GetRequiredService<UserManager<ApplicationDbContext>>();
IdentityUser user = new IdentityUser()
{
UserName = "admin@admin.admin",
Email = "admin@admin.admin"
};
var result = await userManager.CreateAsync(user, "password");
result = await userManager.AddToRoleAsync(user, "Administrator");
}