Jason Knight fired the home side ahead in the 34th minute with a crisp finish from 12 yards after Norwich goalkeeper Angus Gunn had parried a low George Tanner cross into his path.
But the visitors drew level 13 minutes after the break when an intended cross from the left by Dimitris Giannoulis deflected off defender Tanner to wrong-foot Max O’Leary and beat him at his near post.
The match was deep into five minutes of injury time when Idah outpaced Zak Vyner onto a long ball forward and held off the centre-back before firing low into the bottom corner.
Suddenly both sides created openings. Ashley Barnes fired over for Norwich with a volley and seconds later team-mate Onel Hernandez hit a post with a first-time shot from Jonathan Rowe’s cross.
Mark Sykes shot narrowly wide for the hosts before Knight’s precise finish broke the deadlock.
Tommy Conway then had two good chances to extend the lead, but shot tamely at Gunn and then was denied by a brave save from the Norwich keeper as he broke clear onto a Sykes pass.
Knight saw a header from a right-wing corner tipped over by Gunn as the home side finished the first half strongly.
Norwich regrouped at the interval and began well again, Barnes and Marcelino Nunez testing O’Leary before the visitors drew level just before the hour.
The equaliser was fortunate, but merited, as Tanner’s deflection took Giannoulis’ ball into the area past O’Leary.
Tanner’s afternoon went from bad to worse when he was cautioned for a foul on Giannoulis that saw the Norwich player hobble off and be substituted.
Bristol City were looking well-drilled under new head coach Liam Manning and passed the ball neatly to spread the play without being able to carve out the chances they created in the first half.
Knight sent a half-volley from the edge of the box high over the crossbar as the game entered the final 10 minutes.
Norwich defended their box strongly and threatened on the break, but also lacked the final pass to add to their goal tally until Idah’s dramatic late strike.
David Wagner’s players celebrated in front of their travelling fans at the final whistle, having shown good spirit to claim the three points.