The Bora-Hansgrohe completed the 172km course, which started in Le Puy-en-Velay, in a time of 4:15:25.
Wout van Aert (Team Jumbo-Visma) managed second place, which ensured that he kept the young rider jersey for another day. Davide Ballerini (Astana Pro Team) completed the podium.
Edvald Boasson Hagen (Dimension Data) moved up to the front under the flamme rouge, but his spot was taken by Bennett who had Edward Theuns (Trek-Segafredo) on his wheel.
Bennett then led the sprint out and managed to take the stage.
“It was a pretty chaotic final. I was a little worried about how my legs were after the last two days, and then it was so cold during the stage,” said Bennett.
“I felt really good in the final. I have to thank the full team again, they rode really hard all day and then the guys did a great job in the final putting me in a good position.
“I’m trying to get a win in each stage race I go to. It’s sometimes hard to keep that consistency all year. I’ve been doing pretty good in the stage races and just want to keep it going.”
Dylan Teuns (Bahrain-Merida) held on to the overall lead.
View more results below.
Stage three results
1. Sam Bennett (Irl) Bora-Hansgrohe 4:15:25
2. Wout Van Aert (Bel) Team Jumbo-Visma
3. Davide Ballerini (Ita) Astana Pro Team
4. Clement Venturini (Fra) AG2R La Mondiale
5. Edward Theuns (Bel) Trek-Segafredo
6. Edvald Boasson Hagen (Nor) Dimension Data
7. Alvaro Hodeg (Col) Deceuninck-QuickStep
8. Jens Debusschere (Bel) Katusha-Alpecin
9. Luka Mezgec (Slo) Mitchelton-Scott
10. Bjorg Lambrecht (Bel) Lotto Soudal
29. Daryl Impey (RSA) Mitchelton-Scott
68. Jaco Venter (RSA) Dimension Data
72. Stefan De Bod (RSA) Dimension Data
135. Jacques Willem Janse Van Rensburg (RSA) Dimension Data +0:00:56
General classification after stage three
1. Dylan Teuns (Bel) Bahrain-Merida 11:52:28
2. Guillaume Martin (Fra) Wanty-Gobert +0:00:03
3. Alexey Lutsenko (Kaz) Astana Pro Team +0:00:20
4. Jakob Fuglsang (Den) Astana Pro Team
5. Nairo Quintana (Col) Movistar Team +0:00:24
6. Thibaut Pinot (Fra) Groupama-FDJ
7. Michael Woods (Can) EF Education First
8. Chris Froome (GBr) Team Ineos
9. Wout Poels (Ned) Team Ineos
10. Adam Yates (GBr) Mitchelton-Scott
63. Stefan De Bod (RSA) Dimension Data +0:12:51
73. Daryl Impey (RSA) Mitchelton-Scott +0:16:29
118. Jacques Janse Van Rensburg (RSA) Dimension Data +0:29:17
143. Jaco Venter (RSA) Dimension Data +0:37:04