无法从 PasswordHasher 登录到种子自定义 IdentityUser
Cannot login to seeded custom IdentityUser from PasswordHasher
我在上下文 OnModelCreating 方法中创建了用户。当我尝试使用给定的密码登录时,它总是失败。
我还尝试使用 UserManager 创建新帐户,效果非常好。
我认为问题出在 PasswordHasher 中。
上下文class
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
var unconfirmedUser = new AppUser
{
Id = 2,
UserName = "00001",
Identifier = "00001",
FirstName = "TestName",
LastName = "TestLastName",
NormalizedUserName = "TestAccount1",
SecurityStamp = Guid.NewGuid().ToString(),
LockoutEnabled = true
};
unconfirmedUser.PasswordHash = new PasswordHasher<AppUser>()
.HashPassword(unconfirmedUser, "f1fRlQ9c&i72yI_2ApLT");
builder.Entity<AppUser>().HasData(unconfirmedUser); ;
}
控制器
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel model, string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var result = await SignInManager.PasswordSignInAsync(model.Identifier, model.Password,
false, lockoutOnFailure: true);
if (result.Succeeded)
{
Logger.LogInformation($"User: [{model.Identifier}] logged in.");
return LocalRedirect(returnUrl);
}
if (result.IsLockedOut)
{
Logger.LogWarning($"User account: [{model.Identifier}] locked out.");
return RedirectToAction("Lockout", "Account");
}
else
{
ModelState.AddModelError(string.Empty, "Niepoprawne hasło");
}
}
return View(model);
}
Startup.cs
services.Configure<IdentityOptions>(options =>
{
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireUppercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
//options.Lockout.AllowedForNewUsers = true;
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedAccount = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
});
默认情况下,asp.net核心身份将在执行SignInManager.PasswordSignInAsync
时使用NormalizedUserName
登录。如果你想使用 Identifier
登录,一个简单的方法是直接使用 NormalizedUserName
作为标识符:
NormalizedUserName = "00001",
我在上下文 OnModelCreating 方法中创建了用户。当我尝试使用给定的密码登录时,它总是失败。
我还尝试使用 UserManager 创建新帐户,效果非常好。
我认为问题出在 PasswordHasher 中。
上下文class
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
var unconfirmedUser = new AppUser
{
Id = 2,
UserName = "00001",
Identifier = "00001",
FirstName = "TestName",
LastName = "TestLastName",
NormalizedUserName = "TestAccount1",
SecurityStamp = Guid.NewGuid().ToString(),
LockoutEnabled = true
};
unconfirmedUser.PasswordHash = new PasswordHasher<AppUser>()
.HashPassword(unconfirmedUser, "f1fRlQ9c&i72yI_2ApLT");
builder.Entity<AppUser>().HasData(unconfirmedUser); ;
}
控制器
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel model, string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var result = await SignInManager.PasswordSignInAsync(model.Identifier, model.Password,
false, lockoutOnFailure: true);
if (result.Succeeded)
{
Logger.LogInformation($"User: [{model.Identifier}] logged in.");
return LocalRedirect(returnUrl);
}
if (result.IsLockedOut)
{
Logger.LogWarning($"User account: [{model.Identifier}] locked out.");
return RedirectToAction("Lockout", "Account");
}
else
{
ModelState.AddModelError(string.Empty, "Niepoprawne hasło");
}
}
return View(model);
}
Startup.cs
services.Configure<IdentityOptions>(options =>
{
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireUppercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
//options.Lockout.AllowedForNewUsers = true;
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedAccount = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
});
默认情况下,asp.net核心身份将在执行SignInManager.PasswordSignInAsync
时使用NormalizedUserName
登录。如果你想使用 Identifier
登录,一个简单的方法是直接使用 NormalizedUserName
作为标识符:
NormalizedUserName = "00001",