The final vote was 55-45.
Eight Republican senators supported the resolution, despite pushback from Trump and Republican leaders on Capitol Hill. All 47 Democrats also backed the resolution.
"With passage of this resolution, we sent a powerful message that we don’t support starting a war with Iran unless Congress votes that military action is necessary. If we're to order our young men and women in uniform to risk their lives and health in war, it should be on the basis of careful deliberation. After years of Congress avoiding its constitutional duty on matters of war, I’m grateful that a bipartisan majority of Senators affirmed that the President cannot send our troops into conflict without authorization," Sen. Tim Kaine, D-Va., author of the resolution, said in a statement Thursday after the vote.
Kaine introduced the resolution last month after a drone strike, authorized by Trump, killed Iranian Gen. Qassem Soleimani.
The resolution underscores that Congress has the sole power to declare war, as laid out in the Constitution. The resolution also requires that any hostilities with Iran must be explicitly authorized by a declaration of war or specific authorization for use of military force. It does not prevent the U.S. from defending itself from an imminent attack.
"This really is about the proper allocation of power between the three branches of government," Lee said. "This should not be controversial. If you really look into it, it’s not controversial."
On Wednesday, Trump warned the Senate not to approve the resolution, saying it signals "weakness."
"It is very important for our Country’s SECURITY that the United States Senate not vote for the Iran War Powers Resolution. We are doing very well with Iran and this is not the time to show weakness. Americans overwhelmingly support our attack on terrorist Soleimani....," Trump tweeted.
"....If my hands were tied, Iran would have a field day. Sends a very bad signal. The Democrats are only doing this as an attempt to embarrass the Republican Party. Don’t let it happen!" he said.
Senate Majority Leader Mitch McConnell also opposes the measure, and said it is "too blunt and too broad."
"Clearly, this resolution is not ready for prime time," McConnell said on the Senate floor Wednesday. "I believe it is just an effort to broadcast a political message. But even that message can be harmful to our troops and to national security."
"Let’s send the right message with our votes. Let’s defeat this misguided resolution," he added.
The resolution now heads to the House, where it is expected to pass.
But Trump is all but guaranteed to veto the resolution once it reaches his desk -- and the Senate does not currently have the 67 votes needed to override his veto.