Opting to bat first, the islanders rode on Kumar Sangakkara's patient 76 and skipper Angelo Mathews's breezy 41-ball 45 to post a competitive 253 for six in their fifty overs.
In reply, Afghanistan were bundled out for 124 in 38.4 overs, sealing Sri Lanka's place in the final of the five-nation continental tournament.
India, who lost two of their three matches, now need to win with a bonus point against Afghanistan and hope that Bangladesh score an upset victory over Pakistan in the last round-robin matches.
Afghanistan's run-chase never really got momentum as they lost wickets at regular intervals, slipping to 73 for five in the 21st over.
Their batting was in stark contrast to the effort put in by the bowlers, who kept the free-flowing Lankan batsmen in check for a major part of their innings before Mathews broke free.
Sangakkara, though, was the man who kept the Lankan innings afloat when the going got tough.
Afghan captain Mohammad Nabi contributed 37, while Noor Ali Zadran (21) and Asghar Stanikzai (27) were out after getting good starts.
Nabi hit three fours and a six during his 40-ball knock.
The rest of the batting just caved in without much resistance, a far cry from their outing against hosts Bangladesh, who were humbled by the spirited strife-torn nation a couple of days ago.
Ajantha Mendis (3-11), Thisara Perera (3-29) and Chaturanga de Silva (2-29) proved a handful for the Afghani batsmen.
Earlier, Sangakkara continued his impressive run of form with a fine half century before a late flourish powered Sri Lanka to a challenging total.
The Lankans wobbled initially as they were reduced to 83 for three in the 21st over, but recovered to 157 for four in the 37th, courtesy a 74-run stand between wicketkeeper Sangakkara (76) and Dinesh Chandimal (26).
The Afghan seamers struck back after choking the runs in the middle overs as Sri Lanka were reduced to 184 for six in the 42nd over after being 157 for three in the 37th. They could add just 27 runs at the expense of four wickets in five overs.
Captain Mathews then struck a 41-ball unbeaten 45 to take Sri Lanka past 250, their lowest total in the tournament. He shared crucial 69 runs with Thisara Perera (19 not out) for the seventh wicket.
Afghanistan used as many as eight bowlers and were initially able to restrict the Sri Lankan batsmen who have been in fine form in the tournament, having helped the side win both their earlier matches.
Sangakkara continued with his fine form, top-scoring with a 102-ball 76, which was studded with four sixes and one six. He had scored 67 (against Pakistan) and 103 (against India) in Sri Lanka's earlier games.
For Afghanistan, Mirwais Ashraf grabbed two wickets for 29 runs while his fellow-pacers Shapoor Zadran, Dawlat Zadran and left-arm spinner Hamza Hotak took a wicket each.
Image: Kumar Sangakkara
Photograph: Andrew Biraj/Reuters
Turning points in India-Pakistan match: Karthik's miss, Afridi's blast
Mathews expects more from his players before Asia Cup final
Asia Cup: Thirimanne, Malinga help Sri Lanka edge Pakistan
Gavaskar slams Team India's optional practice regimen
The turning points in India-SL match