I recently moved an entire organisation to passkeys in Microsoft Entra ID with a 1 month deadline. This post is the short version of how I did it: what counts as phishing-resistant, what to set up first, how the registration campaign works, and the Conditional Access policy that makes it stick. At the end I share what I learned along the way.
Why phishing-resistant MFA matters
MFA alone is no longer enough. Attackers use adversary-in-the-middle phishing kits that relay the user's sign-in in real time, steal the session token and walk straight past SMS codes and push approvals. MFA fatigue attacks do the same thing with less effort: spam push notifications until someone taps Approve.
Phishing-resistant methods stop this because the credential is bound to the real sign-in domain. A fake login page simply can't use it. The user doesn't have to spot the phish for the protection to work.
In Entra ID, this is what counts:
Phishing-resistant | Not phishing-resistant |
|---|---|
Passkeys (FIDO2) on security keys | SMS and voice call |
Passkeys in Microsoft Authenticator (device-bound) | One-time codes (Authenticator, hardware or software OATH tokens) |
Synced passkeys (iCloud Keychain, Google Password Manager and similar) | Microsoft Authenticator push, even with number matching |
Windows Hello for Business | Email OTP |
macOS Platform SSO (platform credential) | Password on its own |
Certificate-based authentication (multifactor) |
The built-in Phishing-resistant MFA authentication strength in Conditional Access covers the left column. That's what we enforce later in this post.
Since 1 September 2026, SMS and voice users get the passkey nudge, but they can still skip it as often as they like. The blocking prompt only starts on 1 February 2027, or 1 July 2027 for Global Administrators and external users
Step 1: Get the passkey method ready
The registration campaign does nothing useful until the Passkey (FIDO2) method is set up properly. Skip this and users get prompted, try to register, and fail. That's a helpdesk ticket for every one of them.
Go to Entra admin center > Entra ID > Authentication methods > Policies > Passkey (FIDO2) and do the following:
- Enable the method and target All users (or the groups you're rolling out to). Anyone you'll target in the campaign must be in scope here too.
- Opt in to passkey profiles if you haven't already. Your existing settings move into a Default passkey profile. Note that you can't opt out afterwards.
- In the Default profile, set Allow self-service setup to Yes. Without this, users can't register a passkey themselves and the campaign has nothing to point them to.
- Under Passkey types, select both Device-bound and Synced. Device-bound covers security keys and Microsoft Authenticator. Synced covers passkeys stored in iCloud Keychain, Google Password Manager and other providers, which follow the user to their other devices.
- Set Enforce attestation to No. Synced passkeys don't support attestation, so this option disappears from Passkey types if attestation is enforced.
- Leave key restrictions off unless you have a specific list of approved authenticators.
A quick word on synced passkeys. They make the rollout much smoother because users can register once and sign in from their phone, laptop and tablet. The trade-off is that the passkey lives with a consumer provider and you can't verify the make or model. If that's a problem for your admins, create a second profile for privileged users with device-bound only and attestation enforced. You can have up to three profiles.
If you're using passkeys in Microsoft Authenticator, make sure users are on a current version of the app before you start.
Step 2: Configure the registration campaign
The registration campaign (the "nudge") prompts users to set up a passkey right after they complete MFA. It's the easiest way to get people registered without chasing them one by one.
Go to Entra admin center > Entra ID > Authentication methods > Registration campaign. First, check the current state. Many tenants are already on Microsoft managed, which nudges users daily but lets them skip forever. If you have a deadline, you need to take control.
Setting | What it does | What I used |
|---|---|---|
State | Microsoft managed uses Microsoft's defaults and can change without notice. Enabled gives you control. Disabled turns it off. | Enabled |
Authentication method | The method users are prompted to register. Only one at a time. | Passkey (FIDO2) |
Days allowed to snooze | How long the prompt stays hidden after a user selects Skip for now. 0 to 14 days. | 2 (short deadline) |
Limited number of snoozes | Enabled: three skips, then registration is required. Disabled: unlimited skips. | Enabled |
Include | Who gets prompted. | All users (dynamic Group) |
Exclude | Who never gets prompted. | Break-glass, service and shared accounts |
How the three skips work
With Limited number of snoozes enabled, every user gets three chances to skip. After the third skip and its quiet period, the next prompt has no skip button. They register a passkey or they don't get in.
With a 2-day snooze, a user who signs in every day looks like this:
- Day 0: first prompt, skip 1
- Day 2: skip 2
- Day 4: skip 3
- Day 6: registration required
That's the best case. A few things stretch it out in real life:
- The prompt only shows at an interactive MFA sign-in. No reminder emails, no notifications. Weekends and long-lived sessions push the dates back.
- Each user's clock starts at their own first prompt, not the day you saved the setting.
- Users who already have a suitable passkey on that device and browser aren't prompted at all.
- Snooze counts are kept per user and survive configuration changes. Decide your settings up front, because changing them later won't hand out fresh skips.
Rule of thumb for picking the snooze days: the forced date is roughly three times the snooze value after the first prompt. Two weeks to deadline? Use 1 or 2 days. A relaxed six-week rollout? 14 days works fine.
Step 3: Enforce with Conditional Access
The campaign gets passkeys registered. It doesn't make anyone use them. Until Conditional Access requires phishing-resistant authentication, users can still sign in with push or SMS, and so can an attacker.
Create a new policy under Entra admin center > Entra ID > Conditional Access > Policies:
Setting | Value |
|---|---|
Name | CA - Require phishing-resistant MFA - All users |
Users: Include | All users |
Users: Exclude | Break-glass accounts, plus a time-limited exceptions group |
Target resources | All resources, exclude any application that not working with Phishing-resistant MFA |
Conditions | location exclude (This will help you to exclude some servers) |
Grant | Grant access, Require authentication strength: Phishing-resistant MFA |
Session | None |
Enable policy | Report-only first, then On |
- Excluding location will help you some server location which some users need to sign-in insider the RDP.
- Users: Exclude, time-limited exceptions group help admin users to exclude them self when they required. PIM group with timebound with eligible membership.
A few things worth knowing before you flip it to On:
- Run report-only for at least a week. Check the sign-in logs or the Conditional Access insights workbook to see exactly who would be blocked. That list is your to-do list.
- Think about guests. Guest users authenticate in their home tenant, so this policy will hit them differently. Many teams exclude guests at first and handle them in a separate policy.
- Service and shared accounts that sign in interactively need a plan. Workload identities aren't covered by this policy, but anything signing in as a user is.
- Have a recovery path. Keep Temporary Access Pass (TAP) ready for users who are locked out or replacing a device, and test the TAP flow against this policy before go-live.
- Stage it if you can. Start with IT, then expand group by group. If you have a hard deadline like I did, at least have report-only running while the campaign does its work.
What I learned doing this for real
Check what's already running. When I opened the registration campaign page, it was already on Microsoft managed and targeting passkeys. Users had been getting daily prompts and skipping them with no limit. Nobody had noticed. Look before you plan.
Measure first. A lot of our users already had passkeys. The User registration details report showed me the real gap, and it was much smaller than "All users" suggested. That changed how hard I needed to push.
The check is per device, not per account. Someone with a passkey on their phone can still get prompted on a new laptop or browser. Test this with users who are already registered, otherwise you'll get confused tickets.
The best phishing-resistant options for users are Windows Hello and passkeys. For Windows users, I recommend Windows Hello and the passkey option, based on user preference. For Mac users, synced passkeys through iCloud should be sufficient. This will provide a better user experience. Additionally, AVD supports passkeys.
Build the exclusion group on day one. Break-glass, service accounts, shared mailboxes and privileged vaulted accounts. If a break-glass account gets forced into registration in the middle of an outage, you'll have a very bad day.
The snooze math is the minimum. On paper our forced date was six days out. In practice weekends pushed most people to day eight or nine. Plan helpdesk cover for the peak, not just the first day.
Write one short guide. One page with screenshots for Windows, Mac, iPhone and Android. Send it before the prompts get serious, and give the helpdesk the same guide plus the TAP process.
Plan for the last few percent. You won't hit 100% by the deadline. People are on leave, devices break. Put them in an exceptions group with an owner and an expiry date, and don't let them hold up enforcement for everyone else.
Do the change request properly. Even though it's a settings change, it changes how every user signs in. A clear backout plan (switch Limited number of snoozes to Disabled, or set the CA policy back to report-only) made approval easy.
Quick checklist
- Passkey (FIDO2) enabled and scoped to the users you'll target
- Allow self-service setup set to Yes
- Passkey profile allows device-bound and synced passkeys (attestation off)
- Exclusion group created for break-glass, service and shared accounts
- Baseline taken from User registration details
- Registration campaign set to Enabled, Passkey (FIDO2), snooze days picked for your deadline, limited snoozes on
- User guide sent and helpdesk briefed, TAP process ready
- Conditional Access policy requiring Phishing-resistant MFA running in report-only
- Stragglers chased, exceptions group with expiry dates
- Conditional Access policy switched to On
Passkeys are the first MFA rollout I've done where users actually said sign-in got easier. Get the setup right before you turn on the campaign, and the rest mostly takes care of itself.






