Financial terms of the deal weren't announced. The contract runs over the 2013-17 seasons with a team option for 2018.
"We are pleased to have reached agreement with Allen on a new multiyear deal," Cardinals General Manager John Mozeliak said in a statement. "He has been a productive middle-of-the-lineup hitter throughout his professional career and we look forward to Allen's continued contributions."
Craig, 28, is heading into his fourth major league season, all of which have been with St. Louis. He has split his playing time between first base and the outfield.
Craig hit .307 with 22 homes runs and 92 RBI in 2012 despite missing the first month of the season as he recovered from knee surgery. Over the 238 games of his career, he has hit .300 with 37 home runs and 150 RBI.
He helped the Cardinals to the 2011 World Series title with three home runs in the series versus Texas.