Пример #1
0
        /// <summary>
        /// Returns a Secret comprised entirely of random bytes retrieved from
        /// a cryptographically secure RNG.
        /// </summary>
        public static Secret Random(int numBytes)
        {
            if (numBytes < 0)
            {
                throw Error.Common_ValueMustBeNonNegative(nameof(numBytes));
            }

            if (numBytes == 0)
            {
                byte dummy;
                return(new Secret(&dummy, 0));
            }
            else
            {
                // Don't use CNG if we're not on Windows.
                if (!OSVersionUtil.IsWindows())
                {
                    return(new Secret(ManagedGenRandomImpl.Instance.GenRandom(numBytes)));
                }

                byte[] bytes = new byte[numBytes];
                fixed(byte *pbBytes = bytes)
                {
                    try
                    {
                        BCryptUtil.GenRandom(pbBytes, (uint)numBytes);
                        return(new Secret(pbBytes, numBytes));
                    }
                    finally
                    {
                        UnsafeBufferUtil.SecureZeroMemory(pbBytes, numBytes);
                    }
                }
            }
        }
        public dynamic Registry([FromBody] UserRegistryModel userRegistry)
        {
            if (ModelState.IsValid)
            {
                UserWriteDTO user = new UserWriteDTO();

                user.UserID   = Guid.NewGuid();
                user.UserName = userRegistry.UserName;
                user.Email    = userRegistry.Email;
                user.Password = BCryptUtil.HashPassword(userRegistry.Password);

                Task <Services.Entities.CustomResponse> task = _userService.RegistryAsync(user);

                if (task.Result.status)
                {
                    UserReadDTO user_return = new UserReadDTO(user.UserID.ToString(), user.UserName, user.Email);

                    return(new
                    {
                        status = true,
                        code = ReturnCodes.DataCreateFailed,
                        message = "Đăng Ký Thành Công",
                        data = user_return
                    });
                }
            }

            return(new
            {
                status = false,
                code = ReturnCodes.DataCreateFailed,
                message = "Đăng Ký Không Thành Công"
            });
        }
        public void UpdatePassword_Success_ActualFalse()
        {
            //Arrange
            db.Users.RemoveRange(db.Users);
            db.SaveChanges();

            User user = new User();

            user.UserID          = Guid.NewGuid();
            user.UserName        = "******";
            user.Email           = "*****@*****.**";
            user.HashPassword    = BCryptUtil.HashPassword("123456");
            user.isAuthenticated = false;

            db.Users.Add(user);
            db.SaveChanges();

            string UserID      = user.UserID.ToString();
            string OldPassword = "******";
            string NewPassword = "******";

            //Act
            var status = userService.UpdatePassword(UserID, OldPassword, NewPassword).Result.status;

            //Assert
            Assert.AreEqual(true, status);
        }
Пример #4
0
        public UnitTest_GetPost_PostService()
        {
            db          = new BlogApplicationDbContext();
            postService = new PostService(db);

            //Arrange
            db.Users.RemoveRange(db.Users);
            db.ImageGalleries.RemoveRange(db.ImageGalleries);

            UserTest = new User();

            UserTest.UserID          = Guid.NewGuid();
            UserTest.UserName        = "******";
            UserTest.Email           = "*****@*****.**";
            UserTest.HashPassword    = BCryptUtil.HashPassword("1234560");
            UserTest.isAuthenticated = false;

            ImageGalleryTest            = new ImageGallery();
            ImageGalleryTest.Base64Code = "data:image/jpeg;base64,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";
            ImageGalleryTest.ImageID    = Guid.NewGuid();

            db.Users.Add(UserTest);
            db.ImageGalleries.Add(ImageGalleryTest);
            db.SaveChanges();
        }
Пример #5
0
        public void Registry_AccountIsExist_ActualFalse()
        {
            //Arrange
            User user = new User
            {
                UserID          = new System.Guid(),
                UserName        = "******",
                Email           = "*****@*****.**",
                HashPassword    = BCryptUtil.HashPassword("123456"),
                isAuthenticated = false
            };

            db.Users.Add(user);
            db.SaveChanges();

            UserWriteDTO userWriteDTO = new UserWriteDTO
            {
                UserID          = new System.Guid(),
                UserName        = "******",
                Email           = "*****@*****.**",
                Password        = BCryptUtil.HashPassword("123456"),
                isAuthenticated = false
            };

            //Act
            var status = userService.RegistryAsync(userWriteDTO).Result.status;

            //Assert
            Assert.AreEqual(status, false);
        }
Пример #6
0
        public void Login_EmailValueLengthEquals0_ActualFalse()
        {
            //Arrange
            User user = new User
            {
                UserID          = new System.Guid(),
                UserName        = "******",
                Email           = "*****@*****.**",
                HashPassword    = BCryptUtil.HashPassword("123456"),
                isAuthenticated = false
            };

            db.Users.RemoveRange(db.Users);

            db.Users.Add(user);
            db.SaveChanges();

            string Email    = "";
            string Password = "******";

            //Act
            var status = userService.Login(Email, Password).status;

            //Assert
            Assert.AreEqual(status, false);
        }
        /*Đăng Nhập*/
        public CustomResponse Login(string Email, string Password)
        {
            if (Email == null || Password == null)
            {
                return(new CustomResponse(false, "Dữ Liệu Không Hợp Lệ"));
            }

            if (Email.Length <= 0 || Password.Length <= 0)
            {
                return(new CustomResponse(false, "Dữ Liệu Không Hợp Lệ"));
            }

            try
            {
                User UserResult = GetUser_EmailAsync(Email).Result;

                if (UserResult != null)
                {
                    if (BCryptUtil.VerifyPassword(Password, UserResult.HashPassword))
                    {
                        return(new CustomResponse(_mapper.Map <UserReadDTO>(UserResult), true, "Đăng Nhập Thành Công"));
                    }
                }
            }
            catch (Exception e)
            {
                return(new CustomResponse(false, e.Message));
            }

            return(new CustomResponse(false, "Đăng Nhập Thất Bại"));
        }
        public static ProtectedMemoryBlob Random(int numBytes)
        {
            CryptoUtil.Assert(numBytes >= 0, "numBytes >= 0");

            if (numBytes == 0)
            {
                byte dummy;
                return(new ProtectedMemoryBlob(&dummy, 0));
            }
            else
            {
                // Don't use CNG if we're not on Windows.
                if (!OSVersionUtil.IsBCryptOnWin7OrLaterAvailable())
                {
                    return(new ProtectedMemoryBlob(ManagedGenRandomImpl.Instance.GenRandom(numBytes)));
                }

                byte[] bytes = new byte[numBytes];
                fixed(byte *pbBytes = bytes)
                {
                    try
                    {
                        BCryptUtil.GenRandom(pbBytes, (uint)numBytes);
                        return(new ProtectedMemoryBlob(pbBytes, numBytes));
                    }
                    finally
                    {
                        UnsafeBufferUtil.SecureZeroMemory(pbBytes, numBytes);
                    }
                }
            }
        }
Пример #9
0
        public void UpdateToken_TokenNotExist_ActualFalse()
        {
            //Arrange
            db.Users.RemoveRange(db.Users);
            db.Tokens.RemoveRange(db.Tokens);

            string      UserID      = Guid.NewGuid().ToString();
            UserReadDTO userReadDTO = new UserReadDTO
            {
                UserID   = UserID,
                Email    = "*****@*****.**",
                UserName = "******"
            };

            Utilities.JWT.TokenResponse tokens = TokenUtil.GenerateTokens(userReadDTO, tokenProviderOption);

            DTO.ReadDTO.TokenReadDTO tokenReadDTO = new DTO.ReadDTO.TokenReadDTO
            {
                AccessToken           = tokens.AccessToken,
                AccessTokenExpriesIn  = tokens.AccessTokenExpiresIn,
                RefreshToken          = tokens.RefreshToken,
                RefreshTokenExpriesIn = tokens.RefreshTokenExpiresIn,
            };

            User user = new User
            {
                UserID          = new Guid(UserID),
                Email           = "*****@*****.**",
                UserName        = "******",
                HashPassword    = BCryptUtil.HashPassword("123456"),
                isAuthenticated = false
            };

            db.Users.Add(user);
            db.SaveChanges();

            Token token = new Token
            {
                AccessToken           = tokenReadDTO.AccessToken,
                AccessTokenExpriesIn  = tokenReadDTO.AccessTokenExpriesIn,
                RefreshToken          = tokenReadDTO.RefreshToken,
                RefreshTokenExpriesIn = tokenReadDTO.RefreshTokenExpriesIn,
                UserID = user.UserID
            };

            db.Tokens.Add(token);
            db.SaveChanges();

            //Act
            var status = userService.UpdateToken(Guid.NewGuid().ToString(), tokenReadDTO).Result.status;

            //Assert
            Assert.AreEqual(false, status);
        }
        /*Update Password*/
        public async Task <CustomResponse> UpdatePassword(string UserID, string OldPassword, string NewPassword)
        {
            if (UserID == null || UserID.Trim().Length == 0)
            {
                return(new CustomResponse(false, "User ID invalid"));
            }

            if (OldPassword == null || OldPassword.Trim().Length == 0)
            {
                return(new CustomResponse(false, "Old Password invalid"));
            }

            if (NewPassword == null || NewPassword.Trim().Length == 0)
            {
                return(new CustomResponse(false, "New Password invalid"));
            }

            try
            {
                User userWillUpdate = db.Users.Where(u => u.UserID.Equals(new Guid(UserID))).FirstOrDefault();

                if (userWillUpdate != null)
                {
                    if (BCryptUtil.VerifyPassword(OldPassword, userWillUpdate.HashPassword))
                    {
                        userWillUpdate.HashPassword = BCryptUtil.HashPassword(NewPassword);

                        await db.SaveChangesAsync();
                    }
                    else
                    {
                        return(new CustomResponse(false, "Mật Khẩu Không Chính Xác"));
                    }
                }
                else
                {
                    return(new CustomResponse(false, "User Not Exist"));
                }
            }
            catch (Exception e)
            {
                return(new CustomResponse(false, e.Message));
            }

            return(new CustomResponse(true, "Update Mật Khẩu Thành Công"));
        }
Пример #11
0
    public void GenRandom_PopulatesBuffer()
    {
        // Arrange
        byte[] bytes = new byte[sizeof(Guid) + 6];
        bytes[0] = 0x04; // leading canary
        bytes[1] = 0x10;
        bytes[2] = 0xE4;
        bytes[sizeof(Guid) + 3] = 0xEA; // trailing canary
        bytes[sizeof(Guid) + 4] = 0xF2;
        bytes[sizeof(Guid) + 5] = 0x6A;

        fixed(byte *pBytes = &bytes[3])
        {
            for (int i = 0; i < 100; i++)
            {
                // Act
                BCryptUtil.GenRandom(pBytes, (uint)sizeof(Guid));

                // Check that the canaries haven't changed
                Assert.Equal(0x04, bytes[0]);
                Assert.Equal(0x10, bytes[1]);
                Assert.Equal(0xE4, bytes[2]);
                Assert.Equal(0xEA, bytes[sizeof(Guid) + 3]);
                Assert.Equal(0xF2, bytes[sizeof(Guid) + 4]);
                Assert.Equal(0x6A, bytes[sizeof(Guid) + 5]);

                // Check that the buffer was actually filled.
                // This check will fail once every 2**128 runs, which is insignificant.
                Guid newGuid = new Guid(bytes.Skip(3).Take(sizeof(Guid)).ToArray());
                Assert.NotEqual(Guid.Empty, newGuid);

                // Check that the first and last bytes of the buffer are not zero, which indicates that they
                // were in fact filled. This check will fail around 0.8% of the time, so we'll iterate up
                // to 100 times, which puts the total failure rate at once every 2**700 runs,
                // which is insignificant.
                if (bytes[3] != 0x00 && bytes[18] != 0x00)
                {
                    return; // success!
                }
            }
        }

        Assert.True(false, "Buffer was not filled as expected.");
    }
Пример #12
0
        public void Registry_Success_ActualTrue()
        {
            //Arrange
            db.Users.RemoveRange(db.Users);
            db.SaveChanges();

            UserWriteDTO userWriteDTO = new UserWriteDTO
            {
                UserID          = new System.Guid(),
                UserName        = "******",
                Email           = "*****@*****.**",
                Password        = BCryptUtil.HashPassword("123456"),
                isAuthenticated = false
            };

            //Act
            var status = userService.RegistryAsync(userWriteDTO).Result.status;

            //Assert
            Assert.AreEqual(status, true);
        }
Пример #13
0
        public async Task <HttpResponseMessage> Login([FromBody] AccountInfo info)
        {
            using (UserDbEntities entities = new UserDbEntities())
            {
                // Search user by ID, and then vaerify the password.
                var entity = await entities.Users.FirstOrDefaultAsync(e => e.UserID == info.UserID);

                if (entity != null)
                {
                    BCryptUtil bCrypt = new BCryptUtil();
                    bool       result = bCrypt.Verify(info.Password, entity.PasswordHash);


                    if (result)
                    {
                        JwtAuthUtil jwt = new JwtAuthUtil(entity.GUID.ToString());
                        // token for portal login
                        string accessToken = jwt.GenerateToken();

                        // return necessary information to the front end
                        return(Request.CreateResponse(HttpStatusCode.OK,
                                                      new
                        {
                            guid = entity.GUID.ToString().ToUpper(),
                            lifeQual = entity.SalesLifeQual.ToUpper(),
                            propQual = entity.SalesPropQual.ToUpper(),
                            access_token = accessToken
                        }));
                    }
                    else
                    {
                        return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Wrong password!!"));
                    }
                }
                else
                {
                    return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "No such user!"));
                }
            }
        }
Пример #14
0
        public void UpdateUserInfor_Success_ActualFalse()
        {
            //Arrange
            db.Users.RemoveRange(db.Users);
            db.SaveChanges();

            User user = new User();

            user.UserID          = Guid.NewGuid();
            user.UserName        = "******";
            user.Email           = "*****@*****.**";
            user.HashPassword    = BCryptUtil.HashPassword("123456");
            user.isAuthenticated = false;

            db.Users.Add(user);
            db.SaveChanges();

            UserReadDTO userReadDTO = new UserReadDTO
            {
                UserID   = user.UserID.ToString(),
                Email    = "*****@*****.**",
                UserName = "******"
            };

            Utilities.JWT.TokenResponse tokens = TokenUtil.GenerateTokens(userReadDTO, tokenProviderOption);

            DTO.ReadDTO.TokenReadDTO tokenReadDTO = new DTO.ReadDTO.TokenReadDTO
            {
                AccessToken           = tokens.AccessToken,
                AccessTokenExpriesIn  = tokens.AccessTokenExpiresIn,
                RefreshToken          = tokens.RefreshToken,
                RefreshTokenExpriesIn = tokens.RefreshTokenExpiresIn,
            };

            //Act
            var status = userService.UpdateUserInfor(userReadDTO).Result.status;

            //Assert
            Assert.AreEqual(status, true);
        }
        public void GetToken_UserIDExistNotLoginFirstTime_Actual()
        {
            //Arrange
            db.Users.RemoveRange(db.Users);

            User user = new User {
                UserID          = new Guid(),
                UserName        = "******",
                Email           = "*****@*****.**",
                HashPassword    = BCryptUtil.HashPassword("123456"),
                isAuthenticated = false
            };

            db.Users.Add(user);
            db.SaveChanges();

            var UserId = user.UserID.ToString();

            //Assert
            var Token = userService.GetToken(UserId);

            //Assert
            Assert.AreEqual(null, Token);
        }
Пример #16
0
 public void GenRandom(byte *pbBuffer, uint cbBuffer)
 {
     BCryptUtil.GenRandom(pbBuffer, cbBuffer);
 }