It was the second game-winning homer in a week for Soriano, who sent Chris Perez's low 1-2 pitch into the left-field bleachers.
Soriano had struggled against St. Louis starter P.J. Walters, making his major-league debut in place of injured ace Chris Carpenter.
The Cardinals, losing for the second time in nine games, couldn't score the tying run after Carlos Marmol walked Colby Rasmus and hit Albert Pujols with a pitch to start the ninth.
Ryan Ludwick, who had hit two home runs, struck out, and pinch-hitter Khalil Greene grounded into a game-ending double play.
Aaron Heilman (2-0) got the victory with one scoreless inning of relief.
Brian Barden had given the Cardinals a 6-5 lead in the sixth with his second homer against the Cubs in as many days. Ludwick's second homer of the game made it 7-5 in the seventh.
All of St. Louis' runs came against Cubs starter Carlos Zambrano, who fired his glove to the ground in frustration after allowing a single by Skip Schumaker during St. Louis' four-run third.
Aramis Ramirez pulled the Cubs within a run in the seventh with an RBI single, his third hit of the day. That put Chicago in position for its eighth-inning comeback against Perez (0-1), who walked pinch-hitter Aaron Miles with one out before serving up Soriano's fifth homer this year.