Fabian Espindola scored his team-leading seventh goal of the season to lead D.C. United to a 1-0 victory over the defending champs on Saturday at RFK Stadium.
Bill Hamid made five saves to preserve his third shutout and D.C.'s fifth this season.
United's victory was their first over Sporting Kansas City since a 2-1 win on May 5, 2010, with Kansas City winning six matches and drawing one since.
Sporting (5-5-4) had its winless streak stretched to five matches as United (6-4-3) climbed past them into second place in the Eastern Conference.
Already without American World Cup call-ups Matt Besler and Graham Zusi, Kansas City lost defender Aurelien Collin in the eighth minute with an apparent recurrence of a right hamstring injury.
Collin previously missed two matches with the same injury earlier this month, and was replaced Saturday by 17-year-old Erik Palmer-Brown, the league's youngest current player.
United also lost defender Chris Korb to an apparent leg injury in the 34th minute. But forward Eddie Johnson was allowed to start after the league waived his red card from last week's match at New England and the resulting suspension.
D.C. substitute Alex Caskey was sent off in the fourth minute of second-half stoppage time for his late, dangerous challenge on Kansas City's Kevin Ellis.
Ellis was also involved in a post-match scrum, with Sporting coach Peter Vermes having to briefly restrain the defender.
Espindola scored in the 28th minute on his long, left-footed strike from outside the penalty area that appeared to be a cross aimed at Johnson.
Instead, it sailed beyond stranded Kansas City goalkeeper Eric Kronberg and into the net for Espindola's third goal in three matches.
Kansas City had chances to tie after halftime. In the 63rd minute, Jacob Peterson reached Benny Feilhaber's cross but headed it wide of Hamid's right post.
Then Hamid made a reaction save on his left post to turn away substitute Soony Saad's whistling shot in the 78th minute.