Rohit Sharma was batting on 17 while Dinesh Karthik was on 2 after pacer Shaminda Eranga dismissed the left-handed Dhawan for 16 and Kohli for two. India now need 163 runs from 35 overs to win the title.
The more aggressive of the two openers, Dhawan was surprised by a delivery that reared up from short of good length, giving him little time to get away from the line as he was already shaping himself up to play it on the front foot.
Angelo Mathews and Suranga Lankmal were bowling tightly at the other end to keep the Indians at leash. The first 10 overs powerplay yielded just 26 runs for India on an uneven surface that was not conducive for strokemaking.
Earlier, India benefited immensely after Sri Lanka's middle and lower-order batsmen committed hara-kiri, which saw the team lose eight wickets for just 30 runs before being bundled out for 201.
More From This Section
Sent into bat, Sri Lanka were sitting pretty at 171 for two in the 38th over, but lack of application saw them being packed off with seven balls left in their innings.
Bhuvneshwar made use of seaming conditions to send back Upul Tharanga and Mahela Jayawardene. Incidentally, the duo had punished India with a double-century partnership in the match that the young seamer was dropped.
Sri Lanka then rode on Kumar Sangakkara (71) and Lahiru Thirimanne's 122-run partnership for the third wicket to stage a fightback before their innings disintegrated largely due to some mindless batting. Thirimanne scored 46 off 72 balls.
From a comfortable position with about 12 overs to go, Sri Lanka were left licking their wounds at 193 for seven in the 46th over when skipper Angelo Mathews got out. None of the last six batsmen could reach double figures.