示例#1
0
        public async Task <IActionResult> GetUserFromDb([FromBody] UserSignIn user)
        {
            User userobj = new User();

            if (user.Login == null || user.Password == null)
            {
                throw new ArgumentNullException();
            }
            // Хэширует пароль для сравнения зашифрованных паролей
            string checkHashString = await HashMD5Service.HashPassword(user.Password);

            // Сравнивает хэши
            var isEqual = await EqualsHash(user.Login);

            if (isEqual != checkHashString)
            {
                return(ErrorViewModel.ErrorEqualHash());
            }
            // Проверяет, есть ли пользователь в БД
            var identity = await GetIdentity(user.Login, isEqual);

            // Если пользователь найден, то получаем его ID
            if (identity != null)
            {
                userobj = db.Users.FirstOrDefault(x => x.Login == user.Login);
            }
            var now = DateTime.UtcNow;

            if (identity == null)
            {
                return(ErrorViewModel.ErrorToken());
            }
            // Создание JWT-токена
            var jwt = new JwtSecurityToken(
                issuer: AuthOptions.ISSUER,
                audience: AuthOptions.AUDIENCE,
                notBefore: now,
                claims: identity.Claims,
                expires: now.Add(TimeSpan.FromMinutes(AuthOptions.LIFETIME)),
                signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256));
            var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);
            // Объект анонимного типа с токеном, который отсылается на фронт
            var response = new {
                access_token = encodedJwt,
                userName     = identity.Name,
                id           = userobj.Id
            };

            return(Json(response));
        }