Example #1
0
    protected override UserDto AddUserImpl(Csla.Security.UsernameCriteria criteria)
    {
      var username = criteria.Username;
      var password = criteria.Password;

      //RECHECK AUTHORIZATION.
      DalHelper.CheckAuthorizationToAddUser();

      //THIS FOR LOOP IS FOR RETRYING DUE TO EF DB DEADLOCK
      int maxTries = int.Parse(EfResources.MaxDeadlockAttempts);
      for (int i = 0; i < maxTries; i++)
      {
        try
        {
          using (var ctx = LearnLanguagesContextManager.Instance.GetManager())
          {
            //VALIDATE USERNAME
            bool usernameIsValid = CommonHelper.UsernameIsValid(username);
            if (!usernameIsValid)
              throw new DataAccess.Exceptions.InvalidUsernameException(username);

            //VALIDATE USER DOESN'T ALREADY EXIST
            var alreadyExists = (from userData in ctx.ObjectContext.UserDatas
                                 where userData.Username == username
                                 select userData).Count() > 0;
            if (alreadyExists)
              throw new DataAccess.Exceptions.UsernameAlreadyExistsException(username);

            //VALIDATE PASSWORD
            bool passwordIsValid = CommonHelper.PasswordIsValid(password);
            if (!passwordIsValid)
              throw new DataAccess.Exceptions.InvalidPasswordException(password);

            //GENERATE UNIQUE SALT 
            //bool saltAlreadyExists = true;
            int salt = -1;
            salt = EfHelper.GenerateNewUniqueSalt(ctx.ObjectContext);
            //Random r = new Random(DateTime.Now.Millisecond * DateTime.Now.Minute * DateTime.Now.Month);
            //int maxSaltTries = int.Parse(DalResources.MaxTriesGenerateSalt);
            //int tries = 0;
            //do
            //{
            //  salt = r.Next(int.Parse(DataAccess.DalResources.MaxSaltValue));

            //  saltAlreadyExists = (from userData in ctx.ObjectContext.UserDatas
            //                       where userData.Salt == salt
            //                       select userData).Count() > 0;

            //  tries++;
            //  if (tries > maxSaltTries)
            //    throw new DataAccess.Exceptions.GeneralDataAccessException("MaxTries for generating salt reached.");
            //} while (saltAlreadyExists);

            //GENERATE SALTEDHASHEDPASSWORD
            var saltedHashedPasswordObj = new Common.SaltedHashedPassword(password, salt);
            string saltedHashedPasswordString = saltedHashedPasswordObj.Value;

            //GET ROLEID FOR PLAIN USER (NOT ADMIN)
            var userRoleData = (from roleData in ctx.ObjectContext.RoleDatas
                                where roleData.Text == DalResources.RoleUser
                                select roleData).First();
            var roleId = userRoleData.Id;

            //CREATE NEW USERDATA
            var newUserData = ctx.ObjectContext.UserDatas.CreateObject();

            //ASSIGN PROPERTIES
            newUserData.Username = username;
            newUserData.Salt = salt;
            newUserData.SaltedHashedPasswordValue = saltedHashedPasswordString;
            newUserData.RoleDatas.Add(userRoleData);

            //ADD TO CONTEXT
            ctx.ObjectContext.UserDatas.AddObject(newUserData);

            //SAVE CHANGES
            ctx.ObjectContext.SaveChanges();

            //CREATE RETURN USERDTO
            var retUserDto = EfHelper.ToDto(newUserData);

            //RETURN IT, WE'RE DONE.
            return retUserDto;
          }
        }
        catch (Exception ex)
        {
          if (ex is System.Data.EntityCommandExecutionException &&
              ex.InnerException is System.Data.SqlClient.SqlException &&
              ex.InnerException.Message.Contains("Rerun the transaction"))
          {
            //"Transaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."
            //DO NOTHING IF THE ERROR IS A DEADLOCK. WE HAVE THIS IN A FOR LOOP THAT WILL RETRY UP TO A MAX NUMBER OF ATTEMPTS
          }
          else
          {
#if DEBUG
            System.Diagnostics.Debugger.Break();
#endif
            //RETHROW THIS EXCEPTION
            throw;
          }
        }
      }

      //IF WE REACH THIS POINT, THEN WE HAVE TRIED OUR MAX TRIES AT BREAKING A SQL DEADLOCK.
#if DEBUG
      //if (retRoles == null)
      System.Diagnostics.Debugger.Break();
#endif
      var errorMsg2 = string.Format(DalResources.ErrorMsgVeryBadException,
                                   DalResources.ErrorMsgVeryBadExceptionDetail_DeadlockRetriesExceededMaxTries);
      throw new Exceptions.VeryBadException(errorMsg2);
    }
Example #2
0
        protected override UserDto AddUserImpl(Csla.Security.UsernameCriteria criteria)
        {
            var username = criteria.Username;
            var password = criteria.Password;

            UserDto retResult = null;


            //VALIDATE USERNAME
            bool usernameIsValid = CommonHelper.UsernameIsValid(username);

            if (!usernameIsValid)
            {
                throw new DataAccess.Exceptions.InvalidUsernameException(username);
            }

            //VALIDATE USER DOESN'T ALREADY EXIST
            if (SeedData.Ton.ContainsUsername(username))
            {
                throw new DataAccess.Exceptions.UsernameAlreadyExistsException(username);
            }

            //VALIDATE PASSWORD
            bool passwordIsValid = CommonHelper.PasswordIsValid(password);

            if (!passwordIsValid)
            {
                throw new DataAccess.Exceptions.InvalidPasswordException(password);
            }

            //GENERATE UNIQUE SALT
            bool   saltAlreadyExists = true;
            int    salt     = -1;
            Random r        = new Random(DateTime.Now.Millisecond * DateTime.Now.Minute * DateTime.Now.Month);
            int    maxTries = int.Parse(DalResources.MaxTriesGenerateSalt);
            int    tries    = 0;

            do
            {
                salt = r.Next(int.Parse(DataAccess.DalResources.MaxSaltValue));
                saltAlreadyExists = SeedData.Ton.ContainsSalt(salt);
                tries++;
                if (tries > maxTries)
                {
                    throw new DataAccess.Exceptions.GeneralDataAccessException("MaxTries for generating salt reached.");
                }
            } while (saltAlreadyExists);

            //GENERATE SALTEDHASHEDPASSWORD
            var    saltedHashedPasswordObj    = new Common.SaltedHashedPassword(password, salt);
            string saltedHashedPasswordString = saltedHashedPasswordObj.Value;

            //GET ROLEID FOR PLAIN USER (NOT ADMIN)
            var roleId = SeedData.Ton.UserRoleId;

            //CREATE ACTUAL USERDTO
            UserDto newUserDto = new UserDto()
            {
                Id       = Guid.NewGuid(),
                Username = username,
                Salt     = salt,
                SaltedHashedPasswordValue = saltedHashedPasswordString,
                RoleIds = new List <Guid>()
                {
                    roleId
                }
            };

            //ADD THE USER TO THE SEEDDATA (WE ARE IN THE MOCK DAL)
            SeedData.Ton.Users.Add(newUserDto);

            //ASSIGN SUCCESFUL RESULT WITH USERDTO
            retResult = newUserDto;

            //RETURN RESULT
            return(retResult);
        }
Example #3
0
    protected override UserDto AddUserImpl(Csla.Security.UsernameCriteria criteria)
    {
      var username = criteria.Username;
      var password = criteria.Password;

      UserDto retResult = null;


      //VALIDATE USERNAME
      bool usernameIsValid = CommonHelper.UsernameIsValid(username);
      if (!usernameIsValid)
        throw new DataAccess.Exceptions.InvalidUsernameException(username);

      //VALIDATE USER DOESN'T ALREADY EXIST
      if (SeedData.Ton.ContainsUsername(username))
        throw new DataAccess.Exceptions.UsernameAlreadyExistsException(username);

      //VALIDATE PASSWORD
      bool passwordIsValid = CommonHelper.PasswordIsValid(password);
      if (!passwordIsValid)
        throw new DataAccess.Exceptions.InvalidPasswordException(password);

      //GENERATE UNIQUE SALT 
      bool saltAlreadyExists = true;
      int salt = -1;
      Random r = new Random(DateTime.Now.Millisecond * DateTime.Now.Minute * DateTime.Now.Month);
      int maxTries = int.Parse(DalResources.MaxTriesGenerateSalt);
      int tries = 0;
      do
      {
        salt = r.Next(int.Parse(DataAccess.DalResources.MaxSaltValue));
        saltAlreadyExists = SeedData.Ton.ContainsSalt(salt);
        tries++;
        if (tries > maxTries)
          throw new DataAccess.Exceptions.GeneralDataAccessException("MaxTries for generating salt reached.");
      } while (saltAlreadyExists);

      //GENERATE SALTEDHASHEDPASSWORD
      var saltedHashedPasswordObj = new Common.SaltedHashedPassword(password, salt);
      string saltedHashedPasswordString = saltedHashedPasswordObj.Value;

      //GET ROLEID FOR PLAIN USER (NOT ADMIN)
      var roleId = SeedData.Ton.UserRoleId;

      //CREATE ACTUAL USERDTO
      UserDto newUserDto = new UserDto()
      {
        Id = Guid.NewGuid(),
        Username = username,
        Salt = salt,
        SaltedHashedPasswordValue = saltedHashedPasswordString,
        RoleIds = new List<Guid>() { roleId }
      };

      //ADD THE USER TO THE SEEDDATA (WE ARE IN THE MOCK DAL)
      SeedData.Ton.Users.Add(newUserDto);

      //ASSIGN SUCCESFUL RESULT WITH USERDTO
      retResult = newUserDto;

      //RETURN RESULT
      return retResult;
    }
Example #4
0
        protected override UserDto AddUserImpl(Csla.Security.UsernameCriteria criteria)
        {
            var username = criteria.Username;
            var password = criteria.Password;

            //RECHECK AUTHORIZATION.
            DalHelper.CheckAuthorizationToAddUser();

            //THIS FOR LOOP IS FOR RETRYING DUE TO EF DB DEADLOCK
            int maxTries = int.Parse(EfResources.MaxDeadlockAttempts);

            for (int i = 0; i < maxTries; i++)
            {
                try
                {
                    using (var ctx = LearnLanguagesContextManager.Instance.GetManager())
                    {
                        //VALIDATE USERNAME
                        bool usernameIsValid = CommonHelper.UsernameIsValid(username);
                        if (!usernameIsValid)
                        {
                            throw new DataAccess.Exceptions.InvalidUsernameException(username);
                        }

                        //VALIDATE USER DOESN'T ALREADY EXIST
                        var alreadyExists = (from userData in ctx.ObjectContext.UserDatas
                                             where userData.Username == username
                                             select userData).Count() > 0;
                        if (alreadyExists)
                        {
                            throw new DataAccess.Exceptions.UsernameAlreadyExistsException(username);
                        }

                        //VALIDATE PASSWORD
                        bool passwordIsValid = CommonHelper.PasswordIsValid(password);
                        if (!passwordIsValid)
                        {
                            throw new DataAccess.Exceptions.InvalidPasswordException(password);
                        }

                        //GENERATE UNIQUE SALT
                        //bool saltAlreadyExists = true;
                        int salt = -1;
                        salt = EfHelper.GenerateNewUniqueSalt(ctx.ObjectContext);
                        //Random r = new Random(DateTime.Now.Millisecond * DateTime.Now.Minute * DateTime.Now.Month);
                        //int maxSaltTries = int.Parse(DalResources.MaxTriesGenerateSalt);
                        //int tries = 0;
                        //do
                        //{
                        //  salt = r.Next(int.Parse(DataAccess.DalResources.MaxSaltValue));

                        //  saltAlreadyExists = (from userData in ctx.ObjectContext.UserDatas
                        //                       where userData.Salt == salt
                        //                       select userData).Count() > 0;

                        //  tries++;
                        //  if (tries > maxSaltTries)
                        //    throw new DataAccess.Exceptions.GeneralDataAccessException("MaxTries for generating salt reached.");
                        //} while (saltAlreadyExists);

                        //GENERATE SALTEDHASHEDPASSWORD
                        var    saltedHashedPasswordObj    = new Common.SaltedHashedPassword(password, salt);
                        string saltedHashedPasswordString = saltedHashedPasswordObj.Value;

                        //GET ROLEID FOR PLAIN USER (NOT ADMIN)
                        var userRoleData = (from roleData in ctx.ObjectContext.RoleDatas
                                            where roleData.Text == DalResources.RoleUser
                                            select roleData).First();
                        var roleId = userRoleData.Id;

                        //CREATE NEW USERDATA
                        var newUserData = ctx.ObjectContext.UserDatas.CreateObject();

                        //ASSIGN PROPERTIES
                        newUserData.Username = username;
                        newUserData.Salt     = salt;
                        newUserData.SaltedHashedPasswordValue = saltedHashedPasswordString;
                        newUserData.RoleDatas.Add(userRoleData);

                        //ADD TO CONTEXT
                        ctx.ObjectContext.UserDatas.AddObject(newUserData);

                        //SAVE CHANGES
                        ctx.ObjectContext.SaveChanges();

                        //CREATE RETURN USERDTO
                        var retUserDto = EfHelper.ToDto(newUserData);

                        //RETURN IT, WE'RE DONE.
                        return(retUserDto);
                    }
                }
                catch (Exception ex)
                {
                    if (ex is System.Data.EntityCommandExecutionException &&
                        ex.InnerException is System.Data.SqlClient.SqlException &&
                        ex.InnerException.Message.Contains("Rerun the transaction"))
                    {
                        //"Transaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."
                        //DO NOTHING IF THE ERROR IS A DEADLOCK. WE HAVE THIS IN A FOR LOOP THAT WILL RETRY UP TO A MAX NUMBER OF ATTEMPTS
                    }
                    else
                    {
#if DEBUG
                        System.Diagnostics.Debugger.Break();
#endif
                        //RETHROW THIS EXCEPTION
                        throw;
                    }
                }
            }

            //IF WE REACH THIS POINT, THEN WE HAVE TRIED OUR MAX TRIES AT BREAKING A SQL DEADLOCK.
#if DEBUG
            //if (retRoles == null)
            System.Diagnostics.Debugger.Break();
#endif
            var errorMsg2 = string.Format(DalResources.ErrorMsgVeryBadException,
                                          DalResources.ErrorMsgVeryBadExceptionDetail_DeadlockRetriesExceededMaxTries);
            throw new Exceptions.VeryBadException(errorMsg2);
        }
        public Result<UserDto> AddUser(string newUsername, string password)
        {
            Result<UserDto> retResult = Result<UserDto>.Undefined(null);
              try
              {
            //VALIDATE WE ARE IN ROLE TO ADD A USER
            bool isInRoleToAddUser = DalHelper.IsInRoleToAddUser();
            if (!isInRoleToAddUser)
              throw new DataAccess.Exceptions.UserNotAuthorizedException(DalResources.ErrorMsgAttemptedToAddUser, 0);

            //VALIDATE USERNAME
            bool usernameIsValid = CommonHelper.UsernameIsValid(newUsername);
            if (!usernameIsValid)
              throw new DataAccess.Exceptions.InvalidUsernameException(newUsername);

            //VALIDATE USER DOESN'T ALREADY EXIST
            if (SeedData.Ton.ContainsUsername(newUsername))
              throw new DataAccess.Exceptions.UsernameAlreadyExistsException(newUsername);

            //VALIDATE PASSWORD
            bool passwordIsValid = CommonHelper.PasswordIsValid(password);
            if (!passwordIsValid)
              throw new DataAccess.Exceptions.InvalidPasswordException(password);

            //GENERATE UNIQUE SALT
            bool saltAlreadyExists = true;
            int salt = -1;
            Random r = new Random(DateTime.Now.Millisecond * DateTime.Now.Minute * DateTime.Now.Month);
            int maxTries = int.Parse(DalResources.MaxTriesGenerateSalt);
            int tries = 0;
            do
            {
              salt = r.Next(int.Parse(DataAccess.DalResources.MaxSaltValue));
              saltAlreadyExists = SeedData.Ton.ContainsSalt(salt);
              tries++;
              if (tries > maxTries)
            throw new DataAccess.Exceptions.GeneralDataAccessException("MaxTries for generating salt reached.");
            } while (saltAlreadyExists);

            //GENERATE SALTEDHASHEDPASSWORD
            var saltedHashedPasswordObj = new Common.SaltedHashedPassword(password, salt);
            string saltedHashedPasswordString = saltedHashedPasswordObj.Value;

            //GET ROLEID FOR PLAIN USER (NOT ADMIN)
            var roleId = SeedData.Ton.UserRoleId;

            //CREATE ACTUAL USERDTO
            UserDto newUserDto = new UserDto()
            {
              Id = Guid.NewGuid(),
              Username = newUsername,
              Salt = salt,
              SaltedHashedPasswordValue = saltedHashedPasswordString,
              RoleIds = new List<Guid>() { roleId }
            };

            //ADD THE USER TO THE SEEDDATA (WE ARE IN THE MOCK DAL)
            SeedData.Ton.Users.Add(newUserDto);

            //ASSIGN SUCCESFUL RESULT WITH USERDTO
            retResult = Result<UserDto>.Success(newUserDto);
              }
              catch (Exception ex)
              {
            //WRAP EXCEPTION IN FAILURE WITH INFO RESULT
            retResult = Result<UserDto>.FailureWithInfo(null, ex);
              }

              //RETURN RESULT
              return retResult;
        }