asp.net Bcrypt验证始终返回false

kupeojn6  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(201)
[HttpPost("signUp")]
    public async Task<ActionResult<Users>> PostUserRegister(Users user)
    {
        if (userEmailExists(user.Email))
        {
            return BadRequest();
        }

        string salt = BC.GenerateSalt(12);
        // hash password
        user.Password = BC.HashPassword(user.Password, salt);

        _context.Database.ExecuteSqlRaw("EXECUTE dbo.UserRegister @userName, @firstName, @lastName, @Password, @userEmail, @gender, @dob",
        new SqlParameter("@userName", user.UserName.ToString()),
        new SqlParameter("@firstName", user.FirstName.ToString()),
        new SqlParameter("@lastName", user.LastName.ToString()),
        new SqlParameter("@Password", user.Password.ToString()),
        new SqlParameter("@userEmail", user.Email.ToString()),
        new SqlParameter("@gender", user.Gender.ToString()),
        new SqlParameter("@dob", user.Dob));

       /* var format = "dd/MM/yyyy";

        var date = DateTime.ParseExact(user.Dob, format);*/

        return Ok(user);
        //_context.Users.Add(users);
        //await _context.SaveChangesAsync();

        //return CreatedAtAction("GetUsers", new { id = users.UserId }, users);
    }

我正在像这样注册一个新用户。用Bcrypt散列密码。

using BC = BCrypt.Net.BCrypt;

[HttpPost("login")]
    public async Task<ActionResult<Users>> PostUserLogin(Users user)
    {
        // get account from database
        var account = _context.Users.SingleOrDefault(x => x.Email == user.Email);

        // check account found and verify password
        if (account == null || !BC.Verify(user.Password, account.Password))
        {
            // authentication failed
            return Unauthorized(user);
        }
        else
        {
            // authentication successful
            return Ok(user);
        }

然后我试着验证登录函数中的密码。当我调试时,看到user.password和account.password的值都是正确的。user.password等于用户输入注册的密码和帐户的密码。密码是存储在数据库中的哈希密码。我试着按照这个教程ASP.NET Core 3.1 - Hash and Verify Passwords with BCrypt

wfauudbj

wfauudbj1#

我已经读了你提供的博客。我认为我们应该仔细检查以下几点。
1.数据库中密码的格式,如果原始密码为11,则存储的值应如下所示:

$2a$12$NTuJLk9/xZnlxP.oFj1mu.1ZypqYP4YuS1QbTBy7ofJwzKLSEEVBq

1.在这行BC.Verify(user.Password, account.Password)
user.password的值

user.Password == 11

和帐户的值。密码

account.Password == $2a$12$NTuJLk9/xZnlxP.oFj1mu.1ZypqYP4YuS1QbTBy7ofJwzKLSEEVBq

请仔细检查,如仍有问题,可添加调试结果图片。

py49o6xq

py49o6xq2#

我和你一样对bCrypt有同样的问题。
主要的问题比我想象的要简单得多,主要原因是我在接收和保存密码时使用了大写小写字母。
我修复了这个问题,使我的密码输入较低,并将其保存到db,当我想验证它,我使密码小写一次。

user.Password = BC.HashPassword(user.Password.ToLower(), salt);

当您想要Verify时,请按如下方式使用它:

if (account == null || !BC.Verify(user.Password.ToLower(),account.Password))

我想这是你的问题回答。

相关问题