Просто замените UTF8.GetBytes
на Convert.FromBase64String
и UTF8.GetString
на Convert.ToBase64String
при регистрации / проверке
public async Task<Users> Register(Users users, string password)
{
byte[] passwordHash, passwordSalt;
CreatePasswordHash(password, out passwordHash, out passwordSalt);
users.PasswordHash = Convert.ToBase64String(passwordHash);
users.PasswordSalt = Convert.ToBase64String(passwordSalt);
//save into database
await _context.Users.AddAsync(users);
await _context.SaveChangesAsync();
return users;
}
и
public async Task<Users> Login(string username, string password)
{
//returns the username from the databse
var user = await _context.Users.FirstOrDefaultAsync(x => x.UserName == username);
if (user == null)
{
return null;
}
if (!VerifyPasswordHash(password, Convert.FromBase64String(user.PasswordHash),
Convert.FromBase64String(user.PasswordSalt)))
return null;
return user;
}
Причина неверного результата:то, что ваш GetString
возвращает строку, содержащую непечатаемые символы, которые не были должным образом сохранены / извлечены из / в базу данных.
Просто распечатайте эти строки, чтобы увидеть, что у вас там получилось.
В отличие от этого, кодировка base64 обеспечивает преобразование байтовых массивов в безопасные строки в том смысле, что вы можетебезопасно хранить / извлекать их.
Вот скрипка слегка измененной версии (удален асинхронный и удаленный текст),
https://dotnetfiddle.net/fH5mXh