The two couldn't be separated after 90 minutes, with chances at a premium in a very cagey affair.
Thomas Müller came close early on with a fierce drive rom range, but he saw his effort tipped over the bar, while Dortmund's best chance in normal time came with five minutes to spare, with Pierre-Emerick Aubameyang uncharacteristically missing from close range.
Extra time remained as tight, with few clear cut chances appearing. Robert Lewandowski was denied by an excellent Erik Durm block, while Henrikh Mkhitaryan volleyed wide at the other end.
However, it would go to penalties, with no-one able to create anything worthy of winning the game.
There, it was Bayern who came out on top as Pep Guardiola leaves the Allianz Arena having done the domestic double in his final campaign.
Bar a fizzing long distance strike from Müller, tipped over the bar well by Roman Bürki - neither team was able to muster anything up to spark this game to life early on.
Bayern controlled the affair as expected, whereas, while they did have a handful of opportunities to counter in the opening exchanges, Dortmund just couldn't get the pass or their first touch right in the final third, seeing any potential moves suddenly break down.
Müller again had a rare sight of goal as we neared the midway point of the first 45 minutes, but it was again just a half-chance if anything, with him directing a difficult header from a corner off target.
We slowly reached the break with little given up by the two defences, though Dortmund's could have given up a penalty on another day. Douglas Costa's shot from range was well-parried by Bürki and then Sokratis Papastathopoulos tugged the lurking Robert Lewandowski away from the loose ball, only for the Poland international to see his appeals waved away by the referee.
The closest those in yellow came to any sort of goal-scoring chance was right on the stroke of half time. A free-kick was delivered towards the far post for Łukasz Piszczek to head across goal and find Sven Bender, but the midfielder just couldn't get his foot over the ball as Manuel Neuer claimed his attempted volley - the height too awkward for Bender to do much with it.
Up a gear
Bayern stepped things up after the break, with Franck Ribery in particular moving up a gear. The Frenchman started to create things for his side on that left wing, and almost inadvertently created the opening goal.
A scuffed shot from the left hand side of the box was pounced upon by Lewandowski, but he was under pressure from Sokratis and unable to get anything more than a toe on the ball as he diverted it nearer the goal - but still wide.
Costa was also starting to cause more problems on the opposite flank after the break, with similar opportunities arising as the ball bobbled around Dortmund's area - waiting for but not getting that clinical finish.
Despite all their dominance though, Bayern were still prone to being exposed on the counter and were almost done so brilliantly just before the hour.
The game had become extremely stretched by this point, something which would suit Dortmund as the looked for chances to break.
A mazy run by Marco Reus saw him ignore the run of Henrikh Mkhitaryan and opt for the option of Aubameyang, but the Gabon international couldn't take the opportunity, with his effort blazed over the bar from inside the box.
An almost identical move saw Bayern come close to opening the scoring a few minutes later, but the same result occurred. Müller rode the challenge of Bayern-bound Mats Hummels before teeing up Lewandowski, but the Pole somehow fired over from a brilliant position.
With extra time nearing, that clinical touch was still lacking as Aubameyang became the next to miss a huge chance. Piszczek delivered a brilliant teasing ball in for his teammate, but he took it with the wrong foot, knocking the ball over the bar instead of stroking it home for his 40th of the season and to surely win the cup, with just five minute remaining.
Extra time just as cagey
With them not to be separated after 90 minutes, extra time was required and only a few minutes in Bayern nearly led. The ball fall to Lewandowski, who must have thought he'd scored when he struck goalwards in the area, but Durm raced across and put in an exceptional last ditch tackle to block.
Bayern spent the rest of the added 30 minutes trying to pick holes in a well-organised Dortmund defence, while the latter spent it looking to break.
Towards the end of the first 15 minutes, Mkhitaryan wasn't far away from a potential cup-winning strike - unsurprisingly on the counter. The ball was lofted towards him and he opted to hit it on the volley with his second touch, but the angle was against him as his shot fizzed across the face of goal.
David Alaba's deflected shot brought the very best out of Bürki in the final moments of added time but, with neither team able to create anything worthy of winning the game in open play, penalties would instead decide it.
Bayern hold their nerve to win it on spot-kicks
The shootout, which took place at the Dortmund fans' end, started with real quality as Shinji Kagawa and Arturo Vidal buried their spot-kicks - the latter's just escaping the fingertips of Bürki.
However, things suddenly took a turn for the worst for Dortmund, as Bender had his poor effort saved comfortably and Sokratis put his wide of the target.
Bürki needed to bail his side out of trouble and he did just that, denying Joshua Kimmich to give the underdogs some hope - hope backed up by Aubameyang's conversion straight after.
Bayern were still one-up though, and Müller kept them in the lead with a splendid effort - meaning Reus had to score, and he did exactly that.
The pressure then shifted to Bürki and Costa, with the 'keeper needing to save and the winger needing to score.
It was the latter who came out on top - smashing the ball into the back of the net and ensuring Guardiola bows out at Bayern having won the double in his final season.