Donegal failed to score a point in the last 30 minutes as Dublin came from three down to win a disappointing All-Ireland semi-final at Croke Park.
Dublin were still trailing by a point in the 58th minute when their forward Diarmuid Connolly was sent-off for raising his hands on Marty Boyle.
That spurred the Dubs on and they won with points from Kevin McManamon, Bryan Cullen and Bernard Brogan.
Dublin will play Kerry in the final on Sunday, 18 September.
Donegal, attempting to reach the decider for the first time since they won their only All-Ireland in 1992, had led 0-6 to 0-3 early in the second half.
In a dreary first period, the Ulster champions' top scorer Colm McFadden opened the scoring with a free and the other Donegal points before the break came from play through Ryan Bradley, Kevin Cassidy and Colm McFadden.
Dublin, who did not score a point from play until the 60th minutes, got just two points in the first half - both Bernard Brogan frees.
A key moment came early in the second half when McFadden found space in front of goal but, instead of finding the net, he blazed over for the single point.
Dublin keeper Stephen Cluxton then came up to land a free and cut Donegal's lead to 0-5 to 0-3.
McFadden landed a superb free in the 43rd minute, but that was to be the lost point for the Ulster county.
A Bernard Brogan free and Cluxton 45 brought the Duns to within a point before Connolly saw red after a brief flare-up.
McManamon scored Dublin's first point from play, skipper Cullen drilled over another and Brogan's fourth free saw Pat Gilroy's men home.