Ошибка хеширования пароля - PullRequest
       1

Ошибка хеширования пароля

0 голосов
/ 19 октября 2018

Я пытаюсь добавить базовую аутентификацию на свой основной веб-сайт asp.net.
Мои пользователи хранятся в базе данных sqlite, и я пытаюсь подтвердить пароль, который вводит пользователь, но по какой-то причине он всегдане удается, даже если введенный пароль правильный.

Любой совет здесь?

Это мое действие для входа в систему:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel ivm)
{
   if (ModelState.IsValid)
   {
      var user = _userRepo.Get(ivm.Email);
      if (user == null)
      {
         ModelState.AddModelError("UserError", "User not found");
         return View("Index", ivm);
      }
      PasswordHasher<User> hasher = new PasswordHasher<User>();
      var result = hasher.VerifyHashedPassword(user, user.Password, ivm.Password);
      if (result != PasswordVerificationResult.Failed)
      {
         string role = "";
         if (user.Role == Models.Enums.Role.Admin)
            role = "Admin";
         else
            role = "User";
         var claims = new[] { new Claim(ClaimTypes.Name, user.Id.ToString()), new Claim(ClaimTypes.Role, role) };
         var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
         await AuthenticationHttpContextExtensions.SignInAsync(HttpContext, CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));
         return RedirectToAction("Index", "Home");
      }
      else
      {
         ModelState.AddModelError("PasswordError", "Wrong password");
         return View("Index", ivm);
      }
   }
   else
   {
      ModelState.AddModelError("ModelError", "ModelError");
      return View("Index", ivm);
   }
}

Пользователь:

[Table("Users")]
public class User
{
    public string Email { get; set; }
    public string Password { get; set; }
    public Role Role { get; set; }
    public Guid Id { get; set; }
}

Текущий пользователь только администратор:

            var user = new User
            {
                Email = "email.com",
                Role = Models.Enums.Role.Admin,
                Id = Guid.NewGuid()
            };
            PasswordHasher<User> phw = new PasswordHasher<User>();
            string hashed = phw.HashPassword(user, "superpassword");
            user.Password = hashed;
            db.Users.Add(user);
            db.SaveChanges();

1 Ответ

0 голосов
/ 20 октября 2018

В моем проекте ASP.NET Core я использую UserManager, который очень хорошо справляется с проверкой пароля

bool correctPassword = await _userManager.CheckPasswordAsync(user, password);

UserManager также обрабатывает создание пользователя без необходимости иметь дело с хэшем пароля.

Одна из перегрузок:

public virtual Task<IdentityResult> CreateAsync(TUser user, string password);

Обновление 1:

на основе предоставленного вами кода вы назначаете хэш пароля для Password членаUser class

Вместо этого вы должны использовать свойство PasswordHash, например,

hostAdminUser = new ApplicationUser()
{
    UserName = SetupConsts.Users.Host.UserName,
    Email = SetupConsts.Users.Host.Email,
    EmailConfirmed = true,
    PasswordHash = new PasswordHasher<ApplicationUser>().HashPassword(hostAdminUser, SetupConsts.Users.Passwords.Default)
};

await _userManager.CreateAsync(hostAdminUser);

, вот соответствующий бит: PasswordHash = new PasswordHasher<ApplicationUser>


Обновление 2:

Чтобы использовать UserManager в ASP.NET Core, вам необходимо вставить его в контроллер

public class AuthController : Controller
{
    private UserManager<ApplicationUser> _userManager;

    public AuthController(
        UserManager<ApplicationUser> userManager
        )
    {
        _userManager = userManager;
    }

вызатем предполагается использовать _userManager экземпляр.

В файле Startup.cs найдите метод с именем ConfigureServices и поместите следующую строку, необходимую для внедрения зависимостей

services.AddTransient<UserManager<ApplicationUser>>();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...