这就是我做到的。
public class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
var context = serviceProvider.GetService<ApplicationDbContext>();
var userManager = serviceProvider.GetService<UserManager<ApplicationUser>>();
var user0 = new ApplicationUser { UserName = "bob", Email = "bob@asd.com" };
var result = userManager.CreateAsync(user0, "Password1!").Result;
}
}
initialize方法在最后的Configure方法的Startup.cs中运行:
SeedData.Initialize(app.ApplicationServices);
当我查看数据库时,用户就像预期的那样。当我尝试登录时,我的登录尝试无效。当我尝试使用相同的电子邮件地址注册用户时,它不会检测到重复的条目并添加具有相同地址的新用户。
UserManager似乎在Controller的上下文中表现不同。我如何才能正确创建种子用户,以便我可以使用它们登录?
Id AccessFailedCount ConcurrencyStamp Email EmailConfirmed LockoutEnabled LockoutEnd NormalizedEmail NormalizedUserName PasswordHash PhoneNumber PhoneNumberConfirmed SecurityStamp TwoFactorEnabled UserName
e3ff23eb-5db9-4eb3-871e-e95232178e1c 0 241c36e0-b0a9-4c86-af98-6d38132947e9 bob@asd.com 0 1 NULL BOB@ASD.COM BOB AQAAAAEAACcQAAAAECFF4uxt8kT3nZgU9nhfticduyI3OXAxCZg+XJT/0Id280Tgf6B9cCY+Il6beRTFWw== NULL 0 3e9a2185-d248-4589-aa30-ecbb145787ff 0 bob
答案 0 :(得分:2)
我刚刚遇到过这个问题。
如下面的代码
var userManager = serviceProvider.GetService>(); ApplicationUser user0, user1; if (context.Users.Any(u => u.UserName == "nemo@mail.com")) user0 = context.Users.First(u => u.UserName == "nemo@mail.com"); else { user0 = new ApplicationUser { UserName = "nemo@mail.com", Email = "nemo@mail.com" }; var result = userManager.CreateAsync(user0, "Abc123").Result; } if (context.Users.Any(u => u.UserName == "teresa@mail.com")) user1 = context.Users.First(u => u.UserName == "teresa@mail.com"); else { user1 = new ApplicationUser { UserName = "teresa@mail.com", Email = "teresa@mail.com" }; var result = userManager.CreateAsync(user1, "Abc123").Result; }
当我使用“teresa@mail.com”登录时,登录将通过“无效登录尝试”消息拒绝。
但是使用“nemo@mail.com”登录将成功。
结果,ASP.net似乎使用UserName&amp;登录验证密码。
答案 1 :(得分:0)
我可以在评论中看到“电子邮件地址作为用户名”,但是我发布了这个答案给任何遇到相同症状的人。我发现当使用具有不同用户名和电子邮件地址的用户播种数据库时,我无法以该用户身份登录。在网站上注册新用户工作正常,我可以以我注册的用户身份登录。查看种子用户和注册用户的数据库,我看到不同之处在于注册用户的电子邮件地址是其用户名。
所以,是的,在Visual Studio模板上构建的应用程序假设您希望我们将电子邮件地址用作用户名。查看AccountController类 - &gt; Login
操作方法(POST)。它使用第一个参数SignInManager.PasswordSignInAsync()
调用model.Email
。将鼠标悬停在该方法上或右键单击转到定义,您将看到第一个参数应为string userName
。
所以你有两个选择: