MINNEAPOLIS -- Case Keenum connected with Stefon Diggs for a 61-yard touchdown as time expired to send the Minnesota Vikings past the New Orleans Saints 29-24 and into the NFC Championship Game next week in Philadelphia.
Trying to get into field-goal range in the final seconds, Keenum lofted a pass high to Diggs, who went up for the ball with New Orleans safety Marcus Williams apparently trying to avoid getting a pass-interference penalty. Diggs made the catch, turned, stayed in bounds and raced the rest of the way down the sideline for the game-winning touchdown.
Drew Brees passed for 294 yards and three touchdowns for New Orleans, which overcame a 17-0 deficit in the second half. Michael Thomas had two touchdown receptions and Alvin Kamara had 105 total yards and a touchdown for the Saints.
Kai Forbath gave the Vikings the lead with a 53-yard field goal. But Brees got the ball back with 1:29 left on the clock, one timeout and the ball at the 25-yard line with what appeared to be the game-winning drive when Wil Lutz hit a 43-yard field goal with 29 seconds left.
With a boisterous crowd in support, Minnesota had a dominant start.
New Orleans went three-and-out on its first possession and Marcus Sherels had a 19-yard punt return for the Vikings. Keenum and Murray methodically moved the ball down the field for a 55-yard drive in eight plays. McKinnon went untouched for a 14-yard touchdown run to cap the drive.
Another quick Saints possession was followed by a Forbath field goal for a Minnesota lead. New Orleans cornerback Ken Crawley was penalized for pass interference on back-to-back plays, covering 54 yards to put the Vikings on the 6-yard line, but the Saints held.
Murray capped a 58-yard drive with a 1-yard touchdown run to start the second quarter one play after Williams was called for pass interference in the end zone.
Penalties came at the worst time for the Saints in the first half. They were penalized six times for 92 yards. They appeared to score on a 29-yard Brees pass to Ted Ginn Jr., but the touchdown was nullified by an illegal shift penalty.
Three plays later, linebacker Anthony Barr intercepted a tipped pass. Defensive end Everson Griffen managed to get his hand on the pass even though his back was to Brees.
New Orleans was driving with its first possession of the second half when Thomas leveled Minnesota safety Andrew Sendejo on a crossing route. Sendejo was trying to come across and didn't see Thomas, who hit the safety hard. Sendejo was down on the ground motionless for several minutes.
Sendejo later walked off on his own and missed the rest of the game while being evaluated for a concussion. The Vikings' players were incensed by what they thought was a dirty hit. Cornerback Xavier Rhodes was yelling at Saints players while Sendejo was down.
On the next play, Rhodes lined up right on Thomas, who beat him off the line of scrimmage on a crossing route. Brees floated a pass over Rhodes for New Orleans' first score.
Keenum threw an interception to Williams on the next play and Thomas' second touchdown brought the Saints within 17-14.
Forbath would add another field goal, but New Orleans was opportunistic again. George Johnson blocked a Ryan Quigley punt and Gerald Hodges recovered at Minnesota's 40-yard line.
Kamara caught a 14-yard touchdown pass to give the Saints the lead, 21-20.
NOTES: Sam Bradford was active as Minnesota's backup quarterback after spending the past nine weeks on injured reserve following knee surgery. Teddy Bridgewater, who was the backup the past eight games, was inactive. ... Mike Remmers made his first career start at left guard for the Vikings, moving from right tackle. Rashod Hill started at right tackle with Jeremiah Sirles backing up. ... New Orleans was shut out in the first half for the first time since 2014. ... The Saints were 0-for-4 on third down in the first half. Minnesota allowed just 25.2 percent of third-down conversions in the regular season, the NFL's best mark since it began tracking the stat in 1991. ... Vikings DT Shamar Stephen left the game with a knee injury and did not return.