It was a night to forget for the Philadelphia back line, which coughed up an own goal and saw its best player sent off.
Rookie Tesho Akindele put the hosts up in the 26th minute, picking a smart run and first-timing a ball over the unresponsive defense from Blas Perez.
Amobi Okugo grabbed a goal to make it 1-1 just before the break. Cristian Maidana's cut-back cross from the end line was left untouched, and Okugo slotted home from a slightly wide position.
A Union defensive breakdown handed Dallas another lead. Under pressure from Perez, Fabinho tried to turn and clear a ball inside the penalty area, but his effort smacked off Sheanon Williams and deflected into the Union net.
Philadelphia's star player was ejected from the game in the 89th minute. Former U.S. national team member Maurice Edu was shown the red card for a heavy, lunging tackle into Blas Perez.
Despite the win, Dallas will be worried by an injury to goalkeeper Chris Seitz, who went down clutching himself following a routine-seeming goal kick.