Note (added later): I just discovered that I have essentially reproduced Henning Makholm's solution at the site he linked to in his comment, all the way down to the colors red and green. I'm leaving this answer up for convenience, at least for now. I swear I didn't peek before I posted! End of note.
Here's a protocol for assigning Secret Santas that I think gives no one any information beyond their assigned recipient, and also avoids "do-overs." It definitely produces a random derangement in a single pass, and I think it does so with uniform distribution.
Imagine yourself as a participant. You begin by writing your name on two slips of paper. You put one inside a red envelope and one inside a green envelope. You seal these envelopes (henceforth I'm going to call them the red card and the green card) and put them together in a (somewhat larger) white envelope, which you leave unsealed. All the participants' white envelopes are identical, as are all the red cards and all the green cards.
The group now gathers, collects the white envelopes, shuffles them like a deck of cards until they are thoroughly, randomly mixed, and deals them out so that everyone now holds a white envelope with someone's names inside the cards inside it.
You now prescribe some linear order among the participants, such as alphabetical or sitting around the table with one person at the "head." The first person (let's say Alice) simply hands the card she is holding to the second person (Bob), who swaps the green card from the envelope he's been holding with the green card from the envelope he's been handed. Bob then "shuffles" the two envelopes to "randomize" them and hands them to the third person (Carol), who chooses one of those two envelopes at random and swaps its green card with the green card from the envelope she's been holding. She also "shuffles" the three white envelopes, and hands them to the fourth person (Dan).
And so forth. When it's your turn, for example, you're handed a stack of white envelopes. You pick one at random and swap its green card with the green card from the white envelope you've been holding, add that envelope to the stack, shuffle the stack of white envelopes to randomize, and hand it on.
After the last person (Zeke) gets done with the final shuffle, the white envelopes are now picked up one by one. Each envelope's green card is opened, revealing the name inside, and the envelope's red card (still sealed) is handed to that person. You can think of the Green card as identifying the Giver, and the Red card as identifying the Receiver. Only each giver looks inside his or her red card to see who they are to be the Secret Santa for -- that's what "secret" means!
I think (but see the "Added later" note below!) the various shufflings of the white envelopes is enough to guarantee that the protocol produces a random derangement with uniform probability, which I think guarantees that no one has any information of any sort except who his or her recipient is to be, but I'd like to see a formal proof of this. (I think simple induction should suffice. Note, however, that there is no secrecy possible until you have at least four people: With three people, as soon as you look at your red card and know who your recipient is, you automatically know that your Secret Santa must be the third person.) In particular, I'm not sure it's necessary for everyone to shuffle after they've made a swap, but I suspect it is, that skipping some may perturb the probability distribution on the set of derangements, so that some people might gain some information beyond whose Secret Santa they are.
Added later: As Henning Makholm astutely points out, the extra shuffles are pointless. Moreover, you do not get a uniform distribution on all derangements, just on the ones that are $n$-cycles. The upshot of this is that each person, on opening their red card, can infer one fact for sure: their recipient is not their Secret Santa. That's because the protocol doesn't produce any $2$-cycles.
You could "fix" this by setting two envelopes aside after the initial shuffle, swapping their green cards (thus creating a $2$-cycle), creating an $(n-2)$-cycle with the rest, and then shuffling all the cards together again before distributing them. This way everyone will calculate that their recipient is their Secret Santa with probability $2/n$ instead of $0$. But what you'd really like is for that probability to be $1/(n-1)$. I can't think of any wrinkle that will achieve that.