City opened the scoring at Old Trafford in the 43rd minute, with United failing to deal with a Kevin De Bruyne corner and David Silva pouncing on a loose ball to poke home from close range.
But United pulled level just a few minutes later in first-half stoppage time as Nicolas Otamendi and Fabian Delph were both unable to cope with a cross into the box, leaving Marcus Rashford unmarked to slot home.
City moved back ahead in the 54th minute through Otamendi, who was on hand to lash in the loose ball after United again struggled to deal with a set piece into the box, with Romelu Lukaku striking his clearance against a teammate.
The visitors came close to extending their lead in the 70th minute as De Bruyne surged through the middle before firing a low strike at goal that David De Gea did well to tip round the post.
United almost found the equaliser five minutes from the end, only for Ederson to produce an excellent double save to first deny Lukaku and then Juan Mata on the rebound.