Madrid were awarded an early penalty when Nacho was caught by Nico Barella and Hazard confidently beat keeper Samir Handanovic. They had chances to increase their lead when Lucas Vazquez hit the post and Hazard had another shot saved.
Referee Anthony Taylor waved away Vidal's penalty appeals after Raphael Varane's challenge with half an hour played, and then showed the Chile international two yellow cards in quick succession for his protests.
The second half saw Madrid well on top. Vazquez crossed for substitute Rodrygo to double their lead after an hour, securing the three points with his first touch.
There was talk of San Siro being Real Madrid's unlucky ground before kickoff. The team had never won here in 90 minutes, in 15 competitive games -- their 2016 Champions League final victory came on penalties -- but their luck was in on this night, when an early penalty was followed by Vidal's bizarre, needless sending off. That double numerical advantage made for a calmer, more controlled evening than might have been expected.
Hazard's goal -- his first in the Champions League since November 2017 -- and his performance in general was another encouraging sign. You still wince every time an opponent catches him anywhere near the ankle, but Madrid will be hoping the Belgium international can start to be consistently influential now.
Mariano Diaz and Martin Odegaard were both subbed off before an hour had been played. The former is perfectly fine as a backup striker but lacks the finesse and subtlety of Karim Benzema, while we're still waiting for the latter to click in a Real Madrid shirt. Otherwise this was a very positive night.
Manager rating out of 10
8 -- Zinedine Zidane picked the same team that had drawn 1-1 at Villarreal in La Liga on Saturday, with the returning Casemiro making the bench. That decision was a surprise -- Zidane loves to rotate -- but it was proved correct, as the team delivered a composed performance to take a big step towards the knockout rounds. Zidane made changes early, bringing on Casemiro and Rodrygo, and the young Brazilian couldn't have made a more immediate impact.
Player ratings (1-10; 10 = best. Players introduced after 70 minutes get no rating)
DF Raphael Varane, 7 -- Involved in one of the game's key moments, appearing to get the slightest touch on the ball in a challenge that saw Vidal sent off for disputing the lack of a penalty awarded.
DF Nacho, 8 -- His best performance for a while. Looked dominant and mature. An unlikely figure to pop up in the Inter box and win a penalty with just five minutes played. Later headed away an on-target Young free kick.
DF Ferland Mendy, 7 -- Did well, but could have doubled Madrid's lead in the first half but overhit a cross when a shot looked a better option. Delivered another wayward cross after that.
MF Toni Kroos, 8 -- So often a Real Madrid move begins at his feet. Saw as much of the ball here as ever. So confident that he went straight for goal from a corner early in the second half.
MF Luka Modric, 8 -- Solid up against a club who were keen to sign him in 2018. Still works incredibly hard at 35, repeatedly closing down Handanovic and almost robbing the ball more than once.
MF Martin Odegaard, 6 -- One or two nice early touches, but otherwise drifted through the game before being substituted.
FW Lucas Vazquez, 8 -- Excellent. Hit the woodwork early on in an impressive first half and had an even better second, setting up Rodrygo for his goal.
FW Eden Hazard, 8 -- Better. Scored confidently from the penalty spot, tested Handanovic again before half-time, and shot wide in the second half. Moved into a false nine role when Mariano went off.
FW Mariano Diaz, 6 -- Didn't score this time, and was taken off early. He's a useful squad player but at this level, Madrid need Benzema available sooner rather than later.
MF Casemiro, 7 -- Not ready to play 90 minutes, but came on and helped protect Madrid's lead.
FW Rodrygo, 8 -- Scored with just 33 seconds on the pitch. Rodrygo now has six goals in nine Champions League games, which is a sensational return.
FW Vinicius Junior, N/R -- Replaced Hazard for the final 12 minutes.