/// <summary>
        /// Prepares the object to serialize as JSON for adding/updating a User object
        /// </summary>
        /// <param name="user">The source User object</param>
        /// <param name="parser">The PnP Token Parser</param>
        /// <returns>The User object to serialize as JSON</returns>
        private object PrepareUserRequestContent(Model.AzureActiveDirectory.User user, TokenParser parser)
        {
            var content = new
            {
                accountEnabled    = user.AccountEnabled,
                displayName       = parser.ParseString(user.DisplayName),
                mailNickname      = parser.ParseString(user.MailNickname),
                userPrincipalName = parser.ParseString(user.UserPrincipalName),
                givenName         = parser.ParseString(user.GivenName),
                surname           = parser.ParseString(user.Surname),
                jobTitle          = parser.ParseString(user.JobTitle),
                mobilePhone       = parser.ParseString(user.MobilePhone),
                officeLocation    = parser.ParseString(user.OfficeLocation),
                preferredLanguage = parser.ParseString(user.PreferredLanguage),
                userType          = "Member",
                usageLocation     = parser.ParseString(user.UsageLocation),
                passwordPolicies  = parser.ParseString(user.PasswordPolicies),
                passwordProfile   = new
                {
                    forceChangePasswordNextSignIn        = user.PasswordProfile.ForceChangePasswordNextSignIn,
                    forceChangePasswordNextSignInWithMfa = user.PasswordProfile.ForceChangePasswordNextSignInWithMfa,
                    password = EncryptionUtility.ToInsecureString(user.PasswordProfile.Password),
                }
            };

            return(content);
        }
        /// <summary>
        /// Creates a User in AAD and configures password and services
        /// </summary>
        /// <param name="scope">The PnP Provisioning Scope</param>
        /// <param name="parser">The PnP Token Parser</param>
        /// <param name="user">The User to create</param>
        /// <param name="accessToken">The OAuth 2.0 Access Token</param>
        /// <returns>The ID of the User</returns>
        private object CreateOrUpdateUser(PnPMonitoredScope scope, TokenParser parser, Model.AzureActiveDirectory.User user, string accessToken)
        {
            var content = PrepareUserRequestContent(user, parser);

            var userId = GraphHelper.CreateOrUpdateGraphObject(scope,
                                                               HttpMethodVerb.POST,
                                                               $"{GraphHelper.MicrosoftGraphBaseURI}v1.0/users",
                                                               content,
                                                               HttpHelper.JsonContentType,
                                                               accessToken,
                                                               "ObjectConflict",
                                                               CoreResources.Provisioning_ObjectHandlers_AAD_User_AlreadyExists,
                                                               "userPrincipalName",
                                                               parser.ParseString(user.UserPrincipalName),
                                                               CoreResources.Provisioning_ObjectHandlers_AAD_User_ProvisioningError,
                                                               canPatch: true);

            return(userId);
        }
        /// <summary>
        /// Synchronizes User's Photo
        /// </summary>
        /// <param name="scope">The PnP Provisioning Scope</param>
        /// <param name="parser">The PnP Token Parser</param>
        /// <param name="connector">The PnP file connector</param>
        /// <param name="user">The target User</param>
        /// <param name="userId">The ID of the target User</param>
        /// <param name="accessToken">The OAuth 2.0 Access Token</param>
        /// <returns>Whether the Photo has been updated or not</returns>
        private static bool SetUserPhoto(PnPMonitoredScope scope, TokenParser parser, FileConnectorBase connector, Model.AzureActiveDirectory.User user, string userId, string accessToken)
        {
            Boolean result = false;

            if (!String.IsNullOrEmpty(user.ProfilePhoto) && connector != null)
            {
                var photoPath  = parser.ParseString(user.ProfilePhoto);
                var photoBytes = ConnectorFileHelper.GetFileBytes(connector, user.ProfilePhoto);

                using (var mem = new MemoryStream())
                {
                    mem.Write(photoBytes, 0, photoBytes.Length);
                    mem.Position = 0;

                    HttpHelper.MakePostRequest(
                        $"{GraphHelper.MicrosoftGraphBaseURI}v1.0/users/{userId}/photo/$value",
                        mem, "image/jpeg", accessToken);
                }
            }

            return(result);
        }