I'm attempting to sign in using the username and password of the user, but for some reason it always fails.
This is the code:
public async Task<ServiceResult> Login(LoginViewModel model)
{
var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberUser, lockoutOnFailure: false);
if (result.Succeeded)
{
return new ServiceResult { Success = true };
}
return new ServiceResult { Success = false };
}
The account details are correct, however I'm not sure if I set up the user account correctly. I didn't register the user using the user manager, instead I added it to my database like this:
private static void AddDefaultUsers(AppDbContext context)
{
if (!context.Users.Any())
{
AppUser defaultAdmin = new AppUser
{
UserName = "Alex"
};
var passwordHasher = new PasswordHasher<AppUser>();
string defaultAdminPassword = "Uh#)#USK&uv7";
string defaultAdminPasswordHash = passwordHasher.HashPassword(defaultAdmin, defaultAdminPassword);
defaultAdmin.PasswordHash = defaultAdminPasswordHash;
context.Users.Add(defaultAdmin);
context.SaveChanges();
var defaultAdminUserRole = new IdentityUserRole<string>
{
UserId = defaultAdmin.Id,
RoleId = context.Roles.SingleOrDefault<IdentityRole>(r => r.Name == "Admin").Id
};
context.UserRoles.Add(defaultAdminUserRole);
context.SaveChanges();
}
}
OK, short version is that I managed to fix it by setting the NormalizedUserName and SecurityStamp properties of AppUser (AppUser extends IdentityUser). NormalizedUserName was an uppercase version of my username, and SecurityStamp was a random string.
In the end I just used the UserManager to create a new user, since it does all that stuff and probably does a way better job of it.
This is the new version of AddDefaultUsers
private static async Task AddDefaultUsers(AppDbContext context, UserManager<AppUser> userManager)
{
if (!context.Users.Any())
{
AppUser defaultAdmin = new AppUser
{
UserName = "Alex",
Email = "emai@emailcom"
};
string defaultAdminPassword = "Uh#)#USK&uv7";
await userManager.CreateAsync(defaultAdmin, defaultAdminPassword);
await userManager.AddToRoleAsync(defaultAdmin, "Admin");
}
}
The Login method didn't change.