Opting to bat, the islanders rode on Kumar Sangakkara's patient 76 and skipper Angelo Mathews' breezy 41-ball 45 to post a competitive 253/6 at the Sher-e-Bangla National Stadium.
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, and further diminishing India's chances.
India have lost two of their three matches and need to win with a bonus point against Afghanistan and hope that Bangladesh score an upset victory over Pakistan in their last respective round-robin matches.
Afghanistan's run-chase never really got the 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 efforts put in by the Afghan bowlers, who kept the free-flowing Lankan batsmen in check for a major part of their innings before Mathews let loose.
Sangakkara, though, was the man who kept the Lankan innings afloat when the going got difficult.
Afghan captain Mohammad Nabi contributed 37, while Noor Ali Zadran (21) and Asghar Stanikzai (27) got out after getting starts. Nabi hit three fours and a six during his 40-ball knock.
The rest of the batting just caved in without putting up any sort of resistance, a far cry from their outing against hosts Bangladesh, who were humbled by the spirited strife-torn nation a couple of days ago.
Among the wickets for Sri Lanka were Ajantha Mendis (3/11), Thisara Perera (3/29) and Chaturanga de Silva (2/29), who proved to be 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.
Sri Lanka wobbled initially as they were reduced to 83 for three in the 21st century, but recovered to 157 for four, courtesy a 74-run stand between Sangakkara 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 over, thereby adding just 27 runs at the expense of four wickets in five overs.
Mathews' late blows towards the end took Sri Lanka past 250, their lowest total in the tournament. He shared crucial 69 runs with Perera (19 not out) for the seventh wicket.
Afghanistan used as many as eight bowlers and were initially able to restrict the Lankan batsmen who have been in fine form in the tournament, having helped their side win both their earlier matches.
Sangakkara continued with his fine form in the tournament, top-scoring with a 102-ball knock, which was studded with four sixes and one six. He had scored 67 (against Pakistan) and 103 (against India) in Sri Lanka's earlier two 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 apiece.