【发布时间】:2019-05-10 05:11:34
【问题描述】:
全新的 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 的正确语法。我通过谷歌找到的其他答案都用他们自己的ApplicationUser替换了IdentityUser,这使水变得浑浊。这是工作功能(希望对某人有所帮助):
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");
}
【问题讨论】:
-
我理解尝试让代码正常工作时的挫败感,尤其是在截止日期紧迫的情况下。我也理解那种大声喊叫什么的诱惑。我们都曾在某些时候去过那里。虽然您的问题确实传达了您的编码问题,但在发布问题时请尽量保持冷静。这样一来,所有人都更加专注于您的编程问题。
-
您是否使用个人用户的默认模板创建了新项目?
-
我建议您添加最后一段,这似乎是工作代码作为您的答案并将其从问题中删除
-
看看这个docs.microsoft.com/en-us/aspnet/core/fundamentals/…。这似乎是您真正的问题所在,而不是身份。这将有助于更好地理解这个概念。
-
stackOverflow 不会让我发布答案(没有足够的声誉点) - 所以我把我的工作代码放在答案中。我敢肯定还有更好的方法来做到这一点......谢谢大家的cmets和乐于助人。我会努力减轻我的挫败感 - 当周围没有人时很容易大喊大叫......谢谢。
标签: asp.net-core identity seeding asp.net-core-identity usermanager