Asp.Net Core Несанкционированный вход в систему - C # - PullRequest
0 голосов
/ 26 марта 2019

Я не знаю, правильный ли мой заголовок. Но у меня есть простая проблема.

Я не могу войти. И это потому, что encrypted data я не могу decrypt это правильно?

По сути, у меня есть метод регистрации.

А это мой AuthRepository

public class AuthRepository : IAuthRepository
    {
        private readonly DataContext _context;

        public AuthRepository(DataContext context)
        {
            _context = context;
        }

        public async Task<User> Login(string username, string password)
        {
            var user = await _context.Users.FirstOrDefaultAsync(x => x.Username == username);

            if (user == null)
                return null;

            if (!VerifyPasswordHash(password, user.PasswordHash, user.PasswordSalt))
                return null;

            return user;
        }

        private bool VerifyPasswordHash(string password, byte[] passwordHash, byte[] passwordSalt)
        {
            using (var hmac = new System.Security.Cryptography.HMACSHA512())
            {
                var computedHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));

                for (int i = 0; i < computedHash.Length; i++)
                {
                    if (computedHash[i] != passwordHash[i])
                        return false;
                }
            }
            return true;
        }

        public async Task<User> Register(User user, string password)
        {
            byte[] passwordHash, passwordSalt;
            CreatePasswordHash(password, out passwordHash, out passwordSalt);

            user.PasswordHash = passwordHash;
            user.PasswordSalt = passwordSalt;

            await _context.Users.AddAsync(user);
            await _context.SaveChangesAsync();

            return user;
        }

        private void CreatePasswordHash(string password, out byte[] passwordHash, out byte[] passwordSalt)
        {
            using (var hmac = new System.Security.Cryptography.HMACSHA512())
            {
                passwordSalt = hmac.Key;
                passwordHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
            }
        }

        public async Task<bool> UserExists(string username)
        {
            if (await _context.Users.AnyAsync(x => x.Username == username))
                return true;
            return false;
        }
    }

Мой register работает. Я проверил это, используя Postman

Но почему я не могу войти?

Что-то не так с моими decrpyting данными encrypted, когда пользователь registered Я пытался найти решение в течение нескольких часов. Но я не могу заставить это работать. Я следую видеоурок. Но я не могу найти разницу с той, что в учебнике и моей.

[Route("api/[controller]")]
    [ApiController]
    public class AuthController : ControllerBase
    {
        private readonly IAuthRepository _repo;
        private readonly IConfiguration _config;

        public AuthController(IAuthRepository repo, IConfiguration config)
        {
            _repo = repo;
            _config = config;
        }
        [HttpPost("register")]
        public async Task<IActionResult> Register(UserForRegisterDto userForRegisterDto)
        {
            userForRegisterDto.Username = userForRegisterDto.Username.ToLower();

            if (await _repo.UserExists(userForRegisterDto.Username))
                return BadRequest("Username already exist");

            var userToCreate = new User
            {
                Username = userForRegisterDto.Username
            };

            var createdUser = await _repo.Register(userToCreate, userForRegisterDto.Password);

            return StatusCode(201);
        }

        [HttpPost("login")]
        public async Task<IActionResult> Login(UserForLoginDto userForLoginDto)
        {
            var userFromRepo = await _repo.Login(userForLoginDto.Username.ToLower(), userForLoginDto.Password);

            if (userFromRepo == null)
                return Unauthorized();


            return Ok();
        }
    }

Я действительно застрял в этой части. Пожалуйста, помогите мне. Спасибо.

Я не обнаружил ни одной ошибки.

Но я заметил это, когда отлаживал программу

enter image description here

enter image description here

Результат массива не совпадает. Это причина Unauthorized login

Если так. Как я могу правильно проверить имя пользователя и пароль.

Я также проверил правильность имени пользователя и пароля, которые я передал в веб-интерфейсе (обычный текст).

1 Ответ

0 голосов
/ 26 марта 2019

Я проверил проблему, когда вы создаете и сравниваете объект System.Security.Cryptography.HMACSHA512 (), из-за этого он всегда генерирует другой хеш. Решением для этого является объявление глобального объекта для этого класса, и вы должны использовать этот объект при создании и проверке хэша. Я проверил это. Это работает нормально в моем случае после объявления глобально.

...