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); }
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); }
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; }
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; }