Search code examples
asp.net-identityasp.net-core-2.0

Asp.Net Core PasswordSignInAsync always fails


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();
    }
}

Solution

  • 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.