On the way to the Jebel Hafeet climb, Kangert and Roche bridged to lone leader Carlos Verona (Orica-BikeExchange) 6.5km before the summit.
Kangert rode away solo with 3.2km to go to take over from Mark Cavendish (Dimension Data) in the lead of the overall ranking on the eve of the conclusive stage.
"I have to thank my team for the freedom they gave me for this race," Kangert said. "We had two cards to play. It sounds like a cliché to thank the team but it’s true, we rode from the beginning and I reached the climb fresh.
"Vincenzo Nibali did a good job behind me. We’ve had four good years together. He’s a captain who gives a lot of confidence to his team-mates.
"I’ve never raced that late in the year. I’ve never had so many kilometres in my legs in the same season. I can’t wait to go home but I’ll go home happy because I came with the ambition of making the top 10, maybe the top 5 if I was being lucky, so to win here is beyond expectations.”
He finished the 150km stage 17 seconds ahead of Roche, while Mekseb Debesay (Dimension Data) and Diego Ulissi (Lampre-Merida), arrived joint-third a further 33 seconds adrift.
Kangert now takes a 21-second general classification lead on Roche and 43 on Ulissi heading into the final stage, a 26-lap sprint around Yas Marina Circuit that is sure to end in a sprint finish.
Mark Cavendish (Dimension-Data) remains the green jersey general points classification leader, Julien Bernard (Trek-Segafredo) holds the best young rider’s white jersey and Jens Keukeleire (Orica-BikeExchange) leads the intermediate sprint classification.