Your tenant has 100% MFA coverage and you are still getting phished. Adversary-in-the-middle (AiTM) kits proxy the real Entra sign-in page, relay the password and the OTP or push approval in real time, and walk away with the session cookie. Every MFA method where the user tells the system a secret — a code, an approval, a number match — can be relayed. The only methods that cannot are the ones where the protocol itself verifies the site: FIDO2/WebAuthn credentials (security keys and passkeys), Windows Hello for Business (WHfB), and multifactor certificate-based authentication.
This article is the rollout program: taking a hybrid Entra ID estate from “passwords plus MFA” to “phishing-resistant credential as the primary sign-in, passwords demoted to a measured, shrinking fallback.” That means the whole machine: the authentication methods policy and passkey profiles with AAGUID restrictions, WHfB trust-model selection and Intune deployment, Temporary Access Pass (TAP) bootstrapping, the Entra Kerberos object that opens file shares without a password, wave-by-wave enforcement via Conditional Access authentication strengths, and the reporting that gates every wave. The security-side design — threat model, attestation tiers, break-glass architecture — lives in the companion Rolling Out Phishing-Resistant Passwordless Auth: FIDO2, Passkeys, and Break-Glass Design; this is the identity team’s execution manual.
Scope is a hybrid estate — Entra ID plus on-prem AD synced by Entra Connect — because that is where passwordless programs stall (the file-share question kills more rollouts than user resistance). Cloud-only tenants simply skip the Kerberos-object sections. By the end you can run this as a 90-day program with personas, waves, exit criteria, and the exact Graph, PowerShell, Intune, and Terraform configuration for each step.
What problem this solves
Three production pains converge here. First, credential phishing survives OTP-era MFA: an AiTM proxy captures the session token after the user “successfully” completes MFA, so your logs show a compliant session — from the attacker’s infrastructure. Second, passwords are your most expensive credential: reset tickets routinely run 20–40% of service-desk volume. Third, partial rollouts create false progress: registering passkeys without enforcement produces shelfware, while enforcing without measured registration produces a lockout event with your CISO’s name on it.
The credential you deploy determines which attacks simply stop working:
| Attack | Password + SMS/OTP | Password + number-matching push | WHfB / FIDO2 passkey | Why the passkey survives |
|---|---|---|---|---|
| AiTM proxy phishing (Evilginx-style) | Compromised | Compromised | Blocked | Assertion is bound to the real origin; proxy’s domain never matches the RP ID |
| Push fatigue / MFA bombing | n/a | Mostly blocked | Blocked (n/a) | Nothing to approve; possession + local gesture required |
| Password spray / credential stuffing | Partially blocked | Partially blocked | Blocked | No password in the flow to spray |
| SIM swap / SS7 interception | Compromised | Not applicable | Blocked | No SMS channel involved |
| OTP phishing over phone call (“read me the code”) | Compromised | Reduced | Blocked | No human-relayable secret exists |
| Keylogger on unmanaged device | Compromised | Session at risk | Key safe | Private key never leaves TPM/authenticator; gesture is local |
Who hits this: every Microsoft 365 enterprise, most acutely those with hybrid AD (on-prem SSO fear), frontline populations (shared devices, no corporate phone), heavy admin tiers, and cyber-insurance or regulatory language that now says “phishing-resistant MFA” explicitly. This program turns that compliance sentence into enforced configuration.
Learning objectives
By the end of this article you can:
- Compare the three passwordless method families — WHfB, FIDO2 security keys, Authenticator passkeys (device-bound and synced) — and assign each to the right persona.
- Choose the correct WHfB trust model, deploy it via Intune Settings Catalog or the PassportForWork CSP, and verify provisioning with
dsregcmdand event logs. - Configure the Passkey (FIDO2) policy with profiles, attestation enforcement, and AAGUID allow-lists — and explain why tightening an allow-list is a revocation event.
- Run TAP-based onboarding at service-desk scale: policy tuning, Graph issuance, and the exact scenarios TAP does and does not satisfy.
- Stand up cloud Kerberos trust so WHfB and FIDO2 users reach on-prem file shares and Kerberos apps without a password.
- Sequence a wave-based rollout — pilot personas, registration campaign, report-only, block — with measurable exit criteria per wave.
- Enforce phishing-resistant MFA with built-in and custom (AAGUID-scoped) authentication strengths without locking out unregistered users.
- Demote passwords deliberately — system-preferred MFA, Windows passwordless experience, never-expiring scrambled passwords — and prove usage is trending to zero.
Prerequisites & where this fits
You should be fluent in Conditional Access design (assignments, grants, report-only), know what Entra Connect syncs, and be comfortable with Microsoft Graph PowerShell; Intune familiarity helps for WHfB. This article assumes the sync design from Microsoft Entra Connect Sync Deep Dive: Designing Hybrid Identity with PHS, PTA, and Seamless SSO and the policy framework from Designing Conditional Access at Scale: A Persona-Based Policy Framework with Authentication Context and Filters, and it feeds the privileged-access designs in Privileged Identity Management and PAM Architecture: Just-in-Time Access at Scale.
What you need in place before wave 0:
| Component | Minimum you need | Why it matters | Owning role |
|---|---|---|---|
| Entra ID licensing | P1 for Conditional Access + authentication strengths; P2 only for risk-based add-ons | The passwordless methods are free on all editions; the enforcement lever is P1 | Licensing / IAM lead |
| Entra Connect (hybrid only) | Current build, syncing onPremisesSamAccountName, onPremisesDomainName, onPremisesSecurityIdentifier |
These three attributes are how Entra mints a partial TGT your DCs will honor | Hybrid Identity Administrator |
| Domain controllers (hybrid only) | Windows Server 2016+, fully patched, enough per site to absorb TGT exchanges | Cloud Kerberos trust redemption happens at your DCs | AD platform team |
| Windows clients | Windows 10 21H2+ or Windows 11 for cloud Kerberos trust; 1903+ for security-key sign-in | Older builds silently lack the partial-TGT client logic | Endpoint team |
| Management channel | Intune (Settings Catalog) or GPO — one, not both, per device | GPO overrides MDM for WHfB; dual channels create silent conflicts | Intune Administrator |
| Directory roles (use PIM) | Authentication Policy Administrator, Conditional Access Administrator, Hybrid Identity Administrator, Privileged Authentication Administrator (TAP for admins) | Least-privilege split of the four control surfaces you will touch | IAM lead |
| Break-glass accounts | Two cloud-only accounts, excluded from every CA policy, FIDO2-secured, alerted on use | Your recovery path when an enforcement policy misfires | Security operations |
Break-glass design is its own discipline, covered in Engineering Break-Glass Emergency Access Accounts in Entra ID: Exclusions, Hardening, and Tamper-Evident Monitoring — do not start wave 1 without it.
Core concepts
Origin binding is the whole trick. A FIDO2/WebAuthn credential is an asymmetric key pair scoped to a relying party ID (RP ID) — for Entra ID, login.microsoft.com. Registration (the attestation ceremony) mints a key pair for that RP ID and proves the authenticator’s make/model; sign-in (the assertion ceremony) signs a challenge only if the origin the browser is actually talking to matches that RP ID. An AiTM proxy on login-micros0ft.evil.example fails the origin check before any secret exists to steal — and the user is never asked to override it.
One gesture is already MFA. A passkey combines possession (the authenticator) with user verification — a PIN or biometric checked locally. Entra treats a user-verified WebAuthn assertion as full MFA in one step: two stronger factors with less ceremony, not one factor instead of two.
Device-bound vs synced changes your assurance, not your phishing resistance. A device-bound passkey (security key, Authenticator passkey, WHfB) never leaves its hardware. A synced passkey (iCloud Keychain, Google Password Manager) is replicated through the provider’s cloud — still origin-bound, but you no longer know how many copies exist, and sync providers present no attestation. Treat synced passkeys as convenience-tier and keep privileged roles on attested, device-bound hardware.
Discoverable credentials enable usernameless sign-in — and consume key slots. Entra sign-in uses discoverable credentials (resident keys) stored on the authenticator, letting a user tap “Sign in with a passkey” without typing a UPN. Slots are finite — YubiKey firmware 5.2/5.4 holds 25, firmware 5.7 holds 100 — so check your vendor’s number before assuming one key covers everything.
Passwordless is NOT password-free. Enabling passkeys deletes nobody’s password — it still exists in Entra and AD, still syncs, still works anywhere you have not blocked it. A real program has two halves: make the strong credential primary, then actively shrink the password’s usable surface while measuring residual password usage down to zero. This article does both.
Three policy layers, three questions. The authentication methods policy: what can this user register and use? Conditional Access authentication strengths: what must they present for this access? Intune/GPO: what does the device provision? Rollouts fail when teams treat these as one switch.
| Term | One-line definition | Where you touch it |
|---|---|---|
| WebAuthn | W3C API browsers/OSes expose for passkey ceremonies | Nothing to configure; it is the plumbing |
| Passkey | Marketing/industry name for a FIDO2 discoverable credential | Auth methods policy: “Passkey (FIDO2)” |
| Device-bound passkey | Passkey locked to one authenticator (key, phone, TPM) | Passkey profile → passkey type |
| Synced passkey | Passkey replicated via iCloud/Google credential sync | Allowed/blocked per profile |
| AAGUID | 128-bit make/model identifier every FIDO2 authenticator reports | Key restrictions allow/block lists |
| Attestation | Cryptographic proof of authenticator make/model at registration | “Enforce attestation” toggle |
| User verification | Local PIN/biometric check on the authenticator | Key firmware; required by Entra sign-in |
| Discoverable credential | Credential stored on-authenticator; enables usernameless | Key slot budgeting |
| TAP | Temporary Access Pass — time-boxed strong bootstrap credential | Auth methods policy + Graph issuance |
| PRT | Primary Refresh Token — Windows device-wide SSO token | Issued on WHfB/FIDO2 Windows sign-in |
| Partial TGT | Kerberos ticket Entra mints for your AD domain | Cloud Kerberos trust; exchanged at a DC |
| Authentication strength | CA grant control requiring specific method combinations | Enforcement waves |
| System-preferred MFA | Entra auto-selects the strongest registered second factor | Tenant-wide behavior; aids demotion |
The ladder your program climbs — where each Entra method sits:
| Method | MFA? | Passwordless? | Phishing-resistant? | Role in this program |
|---|---|---|---|---|
| Password only | No | No | No | The thing being demoted |
| SMS / voice OTP | Yes | Sign-in via SMS exists | No | Disable as coverage rises |
| Software/hardware OATH TOTP | Yes | No | No | Legacy fallback only |
| Authenticator push + number matching | Yes | No | No | Interim; AiTM-relayable |
| Authenticator passwordless phone sign-in | Yes | Yes | No | Useful bridge; not the endgame |
| Temporary Access Pass | Yes (as configured) | Yes | No (it is a typed code) | Bootstrap only, minutes-long lifetime |
| WHfB / FIDO2 passkey / CBA (multifactor) | Yes | Yes | Yes | The destination |
Note the trap in row six: Authenticator phone sign-in (approve + number match, no password) is passwordless but not phishing-resistant — an AiTM page can still drive it. Authenticator passkeys, a different credential in the same app, are. Comms and CA strengths must distinguish the two; Authenticator Passkeys and Number Matching: Stopping MFA Fatigue Attacks covers the client side.
The passwordless method landscape: pick per persona
Get the taxonomy right first: the options have materially different security postures, costs, and operational models — and you will deploy at least three.
| Attribute | Windows Hello for Business | FIDO2 security key | Authenticator passkey (device-bound) | Synced passkey (iCloud/Google) |
|---|---|---|---|---|
| Private key lives in | PC’s TPM | Dedicated key hardware | Phone’s secure element/StrongBox | Provider cloud (HSM-wrapped) + devices |
| Roams across devices | No — per-device credential | Yes — plug into anything | Via cross-device (QR + BLE proximity) | Yes — silent sync |
| User gesture | PIN or biometric on the PC | Touch + key PIN/biometric | Phone biometric/PIN | Device biometric/PIN |
| Attestation at registration | TPM attestation (platform) | Yes — vendor cert + AAGUID | Yes — Authenticator attests | No |
| Per-user hardware cost | ₹0 (uses existing PC) | ₹1,700–8,000 per key | ₹0 (uses existing phone) | ₹0 |
| On-prem AD SSO | Yes, via cloud Kerberos trust | Yes, same Kerberos object | Browser-only sessions | Browser-only sessions |
| Windows desktop sign-in | Yes — native | Yes — with security-key sign-in enabled | Via Web sign-in (Win11) | No |
| Shared-device fit | Poor (per-user container per PC) | Excellent | Poor | Poor |
| Offline sign-in (cached) | Yes | Yes (Windows cached logon) | n/a | n/a |
| Revocation story | Delete key from user object; wipe device | Delete credential; key is dead for tenant | Delete method; wipe app | Delete method; copies may persist in escrow |
| Best population | Every managed Windows user | Admins, shared/kiosk, no-TPM, BYOD-to-corp | Mobile-first and frontline staff | Low-privilege convenience only |
Two program-level calls fall straight out of this table. WHfB is your volume play, keys are your assurance play: WHfB covers the ~90% case (a user at their managed Windows PC) at zero marginal cost; keys cover what WHfB cannot — roaming admins, shared workstations, disabled TPMs. And synced passkeys are unattested: you get zero provenance guarantees, so keep them off privileged accounts entirely.
The persona map the program executes against:
| Persona | Primary credential | Backup credential | Provisioning path | Enforcement wave |
|---|---|---|---|---|
| Tier-0 / privileged admins | FIDO2 key (allow-listed AAGUID) | Second FIDO2 key (stored) | TAP at security desk, in person | Wave 1 (block mode first) |
| IT operations / helpdesk | FIDO2 key | WHfB on managed PC | TAP + self-service | Wave 1–2 |
| Knowledge workers (managed PC) | WHfB | Authenticator passkey | Silent Intune provisioning + campaign | Wave 3 |
| Executives / VIP targets | WHfB + FIDO2 key | Second key | White-glove desk visit | Wave 2 |
| Frontline (shared kiosks) | FIDO2 key (shared-PC sign-in) | TAP via manager escalation | Bulk key issuance per site | Wave 4 |
| Field / mobile-first staff | Authenticator passkey | FIDO2 NFC key | Registration campaign nudge | Wave 4 |
| Contractors / external staff | Authenticator passkey or synced passkey | Time-boxed TAP | Self-service, restricted profile | Wave 4 |
| No-TPM legacy fleet | FIDO2 key | TAP (short-lived) | Bulk issuance | Wave 2–3 |
B2B guests are the exception: guests cannot register passkeys in your resource tenant. They bring home-tenant credentials — configure cross-tenant access settings to trust home-tenant MFA and push the requirement upstream.
Platform coverage determines the edges of the map:
| Platform | WHfB | FIDO2 security key | Authenticator passkey | Notes |
|---|---|---|---|---|
| Windows 10 (1903+) / 11 | Native | Native desktop sign-in + browsers | Cross-device via QR | The main stage |
| macOS | No — use Platform SSO secure-enclave credential instead | Safari/Chrome/Edge via USB/NFC | Cross-device via QR | Platform SSO’s Secure Enclave key counts as phishing-resistant |
| iOS / iPadOS | n/a | NFC/Lightning-USB-C keys in Safari | Native in Authenticator (iOS 17+) | Authenticator AAGUID must be allowed |
| Android | n/a | USB/NFC keys in Chrome/Edge | Native in Authenticator (Android 14+) | Ditto |
| Linux desktops | n/a | Chrome/Edge/Firefox WebAuthn | Cross-device via QR | Keys are the only real option |
| VDI / thin clients | Limited | USB redirection or WebAuthn redirection required | QR flows often blocked | Test explicitly per broker |
Cross-device authentication (the QR-code flow) requires Bluetooth proximity plus internet on both devices — the BLE check is an anti-phishing proximity proof and cannot be disabled or proxied. Fleets that block BLE have effectively blocked phone-passkey sign-in; issue keys there instead.
Windows Hello for Business: trust models, TPM, and gestures
WHfB replaces the device password with a per-user, per-device asymmetric key pair, unlocked by a local gesture and (ideally) sealed in the TPM. At first sign-in on a capable device, provisioning runs: MFA is verified, a key pair is generated, the public key registers to the user object, and the user sets a PIN and optional biometrics. Keys live in the WHfB container — one per user per device, which is why WHfB fits one-user-one-PC populations and kiosks badly.
Trust models: cloud Kerberos trust vs key trust vs certificate trust
Entra sign-in works identically in all three models; the trust model only decides how the device gets Kerberos tickets for on-prem AD resources.
| Dimension | Cloud Kerberos trust | Key trust | Certificate trust |
|---|---|---|---|
| How on-prem SSO works | Entra ID issues a partial TGT, client exchanges it at a DC | DC validates the user’s public key from msDS-KeyCredentialLink |
Client authenticates with a user certificate |
| PKI required | None | DC certificates only (KDC certs from your CA) | Full PKI + NDES/certificate templates |
| AD FS required | No | No | Yes |
| DC requirements | WS2016+, fully patched | WS2016+ with valid KDC certificates | Per PKI design |
| Wait before on-prem SSO works | None — works immediately after provisioning | Up to ~30 min (Entra Connect must sync the public key to AD) | Certificate issuance time |
| RDP with the WHfB credential | Via Remote Credential Guard or cert-in-container | Same | Native (certificate does RDP) |
| Deployment effort | Lowest — one PowerShell object + 3 policy settings | Medium — DC cert hygiene bites | Highest — AD FS + PKI lifecycle |
| Failure surface | Kerberos object health, attribute sync | Cert expiry on DCs, sync lag | AD FS, NDES, CRL availability |
| Microsoft’s direction | Recommended default for new deployments | Legacy-compatible | Only when certificates are a hard requirement |
The decision compresses to this:
| If | Pick |
|---|---|
| New hybrid deployment, no exotic requirements | Cloud Kerberos trust |
| DCs cannot be patched to supported levels (fix that first) | Key trust as a stopgap, then migrate |
| Heavy RDP-with-Hello requirement and existing AD FS + PKI | Certificate trust |
| Cloud-only estate (no on-prem AD) | No trust model needed — WHfB just works |
| Already on key trust, working | Stay, but plan cloud Kerberos trust migration to shed DC-cert ops |
| Both cloud Kerberos and certificate trust policies land on one device | Certificate trust silently wins — remove the conflict |
That last row is a production foot-gun: if Use certificate for on-premises authentication is enabled anywhere in scope, it overrides cloud Kerberos trust with no error surfaced. Leave it not configured unless you deliberately run certificate trust.
TPM, PIN, and biometrics: why the gesture is not a password
The WHfB private key should be generated inside the TPM 2.0 chip — non-exportable, protected by hardware anti-hammering (progressive lockout on wrong-PIN attempts). Without a TPM, Windows falls back to software-protected keys, which is why Require security device = true belongs in your baseline and no-TPM machines route to security keys in the persona map.
| Property | WHfB PIN | WHfB biometric | Password |
|---|---|---|---|
| Where the secret is checked | Locally, by the TPM | Locally, by the biometric stack + TPM | At the IdP / DC, over the network |
| What crosses the wire | A signed assertion, never the PIN | Same | The password (or a hash derivative) |
| Works on any other device | No — unlocks one TPM only | No — template never leaves the device | Yes — that is the problem |
| Brute-force protection | TPM anti-hammering lockout | Falls back to PIN after failures | Lockout policies, spray-able at scale |
| Phishable / relayable | No — nothing to type into a fake page | No | Yes |
| Complexity trade-off | 6-digit numeric is fine (TPM throttles) | n/a | Needs length/entropy policy |
| Reset path | Self-service PIN reset (see below) | Re-enroll biometric locally | Helpdesk ticket, SSPR |
| MFA composition | Have (TPM) + know (PIN) | Have (TPM) + are (biometric) | Know only |
A 6-digit PIN protected by TPM anti-hammering is materially stronger than a 14-character password typed into whatever webpage asks — the single most effective line in your user comms. Force enhanced anti-spoofing (IR liveness) for face-unlock fleets; multi-factor device unlock can require PIN plus biometric or phone proximity for high-assurance desks; dynamic lock locks the PC when the paired phone’s Bluetooth walks away.
Enable non-destructive PIN reset (the Microsoft PIN Reset Service): consent to the PIN Reset Service and Client applications in your tenant, then set Enable PIN recovery = true. Without it, PIN reset is destructive — the container is discarded and the user re-provisions from scratch.
PIN policy reference (PassportForWork CSP, ./Device/Vendor/MSFT/PassportForWork/{TenantId}/Policies/PINComplexity/...):
| Setting | Range / values | Default | Recommendation |
|---|---|---|---|
| MinimumPINLength | 4–127 | 4 | 6 |
| MaximumPINLength | 4–127 | 127 | Leave default |
| Digits | 0 allowed / 1 required / 2 not allowed | Required | Required |
| LowercaseLetters | 0 / 1 / 2 | Not allowed | Not allowed (numeric PINs type fine on all keyboards) |
| UppercaseLetters | 0 / 1 / 2 | Not allowed | Not allowed |
| SpecialCharacters | 0 / 1 / 2 | Not allowed | Not allowed |
| Expiration (days) | 0–730 | 0 (never) | 0 — never expire a PIN |
| History | 0–50 | 0 | 0 (expiry off makes history moot) |
| EnablePinRecovery | true/false | false | true (after consenting to PIN Reset Service) |
| RequireSecurityDevice | true/false | false | true |
Do not port password thinking into PIN policy: forced expiry and alphanumeric complexity add friction with negligible gain against a TPM-throttled local secret — and PIN friction is the top driver of WHfB grumbling.
Deploying via Intune
Two Intune surfaces configure WHfB and they interact: the tenant-wide enrollment page (Devices → Windows → Windows Hello for Business) applies at enrollment time to every enrolling device, while Settings Catalog / Account protection profiles apply to groups on your schedule. The clean pattern: set the enrollment page to Disabled and drive everything through a Settings Catalog profile assigned to device rings.
| Settings Catalog setting (Windows Hello for Business) | Value | Why |
|---|---|---|
| Use Windows Hello For Business | true | Master switch |
| Use Cloud Trust For On Prem Auth | Enabled | Selects cloud Kerberos trust |
| Require Security Device | true | TPM-backed keys only |
| Minimum PIN Length | 6 | Balanced friction |
| Expiration | 0 | Never expire PINs |
| Use Biometrics | true | Allow face/fingerprint gestures |
| Facial Features Use Enhanced Anti Spoofing | true | IR liveness for face unlock |
| Enable Pin Recovery | true | Non-destructive PIN reset |
| Use Certificate For On Prem Auth | Not configured | Avoid the certificate-trust override |
| History / letters / specials | Not configured | Defaults are correct |
Prefer raw OMA-URI? The PassportForWork CSP paths are verbatim ({TenantId} is your directory GUID):
./Device/Vendor/MSFT/PassportForWork/{TenantId}/Policies/UsePassportForWork bool True
./Device/Vendor/MSFT/PassportForWork/{TenantId}/Policies/UseCloudTrustForOnPremAuth bool True
./Device/Vendor/MSFT/PassportForWork/{TenantId}/Policies/RequireSecurityDevice bool True
./Device/Vendor/MSFT/PassportForWork/{TenantId}/Policies/MinimumPINLength int 6
./Device/Vendor/MSFT/PassportForWork/{TenantId}/Policies/EnablePinRecovery bool True
If any GPO also configures WHfB (Computer Configuration → Administrative Templates → Windows Components → Windows Hello for Business), GPO wins and the Intune policy is silently ignored on hybrid-joined devices. Pick exactly one channel per device population and audit for strays before the pilot. For fleets provisioned through Autopilot, WHfB enrollment lands during OOBE — sequence the enrollment-page setting with your Autopilot profile design, as covered in Zero-Touch Windows Provisioning with Intune and Windows Autopilot.
Verifying provisioning
Every WHfB pilot needs a per-device verification script. The checkpoints, in the order they fail:
| Checkpoint | Where to look | Healthy value |
|---|---|---|
| Device join state | dsregcmd /status → Device State |
AzureAdJoined : YES (+ DomainJoined : YES if hybrid) |
| PRT issued | dsregcmd /status → SSO State |
AzureAdPrt : YES |
| WHfB key created | dsregcmd /status → User State |
NgcSet : YES, NgcKeyId populated |
| Partial TGT (cloud Kerberos trust) | dsregcmd /status → SSO State |
OnPremTgt : YES, CloudTgt : YES |
| Provisioning launched | Event Viewer → User Device Registration → Admin | Event 358 (“provisioning will be launched”) |
| Provisioning blocked + reason | Same log | Event 360 lists the failed prerequisite |
| Key registered with Entra | Same log | Event 300 (key registration succeeded) |
| Full TGT after sign-in | klist in user session |
krbtgt/<YOURDOMAIN> ticket present |
C:\> dsregcmd /status
+----------------------------------------------------------------------+
| Device State |
+----------------------------------------------------------------------+
AzureAdJoined : YES
DomainJoined : YES
DeviceName : IN-LT-04821
+----------------------------------------------------------------------+
| SSO State |
+----------------------------------------------------------------------+
AzureAdPrt : YES
OnPremTgt : YES <- cloud Kerberos trust is working
CloudTgt : YES
OnPremTgt : NO with everything else green is the classic signature of a missing or unhealthy Entra Kerberos object — see the on-prem verification cmdlet.
FIDO2 security keys and passkeys: policy, AAGUIDs, provisioning
The Passkey (FIDO2) authentication method governs security keys and passkeys in Authenticator (and synced passkeys where allowed). Since the March 2026 GA, the method uses passkey profiles: named, group-scoped rule sets for attestation, passkey type, and AAGUID restrictions. Existing settings migrate into a Default passkey profile on opt-in, and the opt-in is one-way. Hard limits: a 20 KB policy ceiling and at most three profiles including Default — budget AAGUID lists accordingly.
The policy settings that matter
| Setting | Values | Default | What it controls | Gotcha |
|---|---|---|---|---|
| State | enabled / disabled | disabled | Whether the method exists for targeted users | Scope with groups, never “All users” on day one |
| Include targets | groups | — | Who can register/use passkeys | Registration ≠ enforcement |
| Exclude targets | groups | — | Hard block | Excluded beats included, across all profiles |
| Allow self-service set up | Yes / No | Yes | Registration from Security info | Global toggle — not per-profile |
| Enforce attestation | Yes / No | No | Require verifiable make/model at registration | Blocks synced passkeys (no attestation) |
| Enforce key restrictions | Yes / No | No | Turn AAGUID lists on | Applies to registration and authentication |
| Restrict specific keys | Allow / Block + AAGUID list | — | Pin exact models | Tightening an allow-list = revocation event |
| Passkey type (per profile) | Device-bound / synced | — | Provenance class allowed | Synced ⇒ attestation must be off in that profile |
| Profiles | up to 3, group-scoped | Default | Different rules per persona | A passkey is accepted if it satisfies any one in-scope profile |
Three rows cause production incidents, so read them twice. Key restrictions apply to authentication, not just registration: remove an AAGUID users already registered and they can no longer sign in with that key — sequence allow-list changes like the revocation events they are. Excluded beats included: one exclusion membership silently kills FIDO2 for a user regardless of profiles. And any-one-profile acceptance means a permissive Frontline profile can undermine a strict Admin profile if memberships overlap — keep profile target groups disjoint.
The three-profile model that fits inside the limits:
| Profile | Target groups | Passkey types | Enforce attestation | Key restrictions |
|---|---|---|---|---|
| Default (locked down) | All enabled users | Device-bound | Yes | Block consumer/synced AAGUIDs |
| Admins — hardware only | Tier-0, IT ops, execs | Device-bound | Yes | Allow company-issued key AAGUIDs only |
| Frontline + Authenticator | Frontline, field, contractors | Device-bound | Yes | Allow Authenticator iOS/Android AAGUIDs |
Configure it as code with Graph (the same body works in Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration -BodyParameter):
# PATCH the Passkey (FIDO2) method configuration (Graph v1.0)
PATCH https://graph.microsoft.com/v1.0/policies/authenticationMethodsPolicy/authenticationMethodConfigurations/Fido2
{
"@odata.type": "#microsoft.graph.fido2AuthenticationMethodConfiguration",
"state": "enabled",
"isSelfServiceRegistrationAllowed": true,
"isAttestationEnforced": true,
"keyRestrictions": {
"isEnforced": true,
"enforcementType": "allow",
"aaGuids": [
"2fc0579f-8113-47ea-b116-bb5a8db9202a",
"ee882879-721c-4913-9775-3dfcce97072a",
"de1e552d-db1d-4423-a619-566b625cdc84",
"90a3ccdf-635c-4729-a248-9b709135078f"
]
},
"includeTargets": [
{ "targetType": "group", "id": "<sg-passwordless-pilot-object-id>", "isRegistrationRequired": false }
]
}
There is no Terraform resource for the authentication methods policy in the azuread provider — manage this object via Graph in your pipeline (the JSON above, under version control) and reserve Terraform for the Conditional Access layer.
AAGUIDs: pinning make and model
An AAGUID is the FIDO2-mandated 128-bit identifier for an authenticator model; attestation makes it trustworthy (unenforced, it is a self-reported claim). Combined — allow-list plus attestation — they turn “only company-issued keys for Tier-0” from wiki aspiration into cryptographic policy.
| Authenticator | AAGUID | Notes |
|---|---|---|
| Microsoft Authenticator (Android) | de1e552d-db1d-4423-a619-566b625cdc84 |
Required if Authenticator passkeys are in scope |
| Microsoft Authenticator (iOS) | 90a3ccdf-635c-4729-a248-9b709135078f |
Ditto |
| YubiKey 5 NFC (fw 5.2/5.4) | 2fc0579f-8113-47ea-b116-bb5a8db9202a |
Common corporate issue |
| YubiKey 5 Series USB (fw 5.2/5.4) | ee882879-721c-4913-9775-3dfcce97072a |
USB-A/C, no NFC |
| YubiKey 5 FIPS Series | 73bb0cd4-e502-49b8-9c6f-b59445bf720b |
Regulated environments |
| YubiKey Bio Series | d8522d9f-575b-4866-88a9-ba99fa02f35b |
Fingerprint UV on-key |
| Anything else you procure | Vendor’s published list / FIDO Alliance Metadata Service | Always confirm against vendor docs before pinning — AAGUIDs change per firmware generation |
Inventory what is already registered before you enforce anything:
# Enumerate registered FIDO2 credentials and group by model across the fleet
Connect-MgGraph -Scopes "UserAuthenticationMethod.Read.All"
Get-MgUserAuthenticationFido2Method -UserId "ada@contoso.com" |
Select-Object DisplayName, AaGuid, Model, AttestationLevel, CreatedDateTime
Windows desktop sign-in with a security key
Signing into Windows itself with a FIDO2 key — the kiosk and shared-PC scenario — is a separate switch. Enable it via Intune (Account protection → “Use security keys for sign-in”) or the CSP:
./Device/Vendor/MSFT/PassportForWork/SecurityKey/UseSecurityKeyForSignin int 1
Windows 10 1903+ is required; hybrid-joined on-prem SSO rides the same Entra Kerberos object as WHfB. For frontline shared PCs, pair this with key-per-user issuance — the key is the badge.
Provisioning at scale: five paths
| Path | Who acts | Prerequisite | Scale ceiling | Best for |
|---|---|---|---|---|
| Self-service (Security info) | User | An existing MFA method + MFA within the last 5 minutes | Unlimited | Users who already have Authenticator |
| TAP bootstrap | Helpdesk issues, user registers | TAP policy scoped to onboarding group | Desk throughput (~60–80/agent/day) | New hires, lost-credential recovery, admins |
| Graph on-behalf provisioning | Admin/automation | beta WebAuthn creationOptions flow + physical key access |
Scripted batches | Pre-staging keys before a site cutover |
| Vendor pre-registration | Key vendor + your automation | Vendor program wired to the same Graph provisioning APIs | Thousands | Shipping pre-registered keys to remote staff |
| Registration campaign (nudge) | Entra interrupts sign-in | Authenticator/passkey eligibility | Tenant-wide | The long tail of knowledge workers |
The Graph on-behalf flow (beta as of this writing) is the interesting one for bulk staging — request WebAuthn creation options for the user, perform the ceremony against the physical key with vendor tooling, then POST the resulting credential back:
# 1) Get WebAuthn creation options for the target user
GET https://graph.microsoft.com/beta/users/{userId}/authentication/fido2Methods/creationOptions(challengeTimeoutInMinutes=10)
# 2) Register the attested credential produced by the key ceremony
POST https://graph.microsoft.com/beta/users/{userId}/authentication/fido2Methods
Whichever path provisions it, the two-credential rule applies from day one: two independent phishing-resistant credentials per user (WHfB + key, key + Authenticator passkey, or two keys for Tier-0). One registered credential plus an enforced strength equals a helpdesk call the day the key meets the washing machine.
Temporary Access Pass: the bootstrap credential
The chicken-and-egg problem is structural: registering a strong credential requires proving identity strongly, which a new hire (or a user whose only key just died) cannot do. A Temporary Access Pass breaks the loop — a time-boxed, optionally single-use code that satisfies strong authentication so the user can enroll the real credential. TAP is a bridge, never a destination: it is a typed code, phishable during its lifetime, so keep lifetimes in minutes and onboarding passes one-time.
| Parameter | Range | Policy default | Program recommendation |
|---|---|---|---|
| Minimum lifetime | 10 min – 30 days (43,200 min) | 60 min | 60 min |
| Maximum lifetime | 10 min – 30 days | 480 min (8 h) | 240 min — cap what the desk can issue |
| Default lifetime | within min/max | 60 min | 60 min |
| Length | 8–48 characters | 8 | 8 (12 for admin-issued) |
| One-time use enforced | Yes / No | No | Yes for the onboarding profile |
| Active TAPs per user | 1 | — | Design the runbook around “one live TAP” |
| Who can create | Authentication Admin (non-admins), Privileged Authentication Admin (anyone incl. admins), Global Admin | — | Desk gets Auth Admin via PIM; admin TAPs need the privileged role |
Enable the method scoped to an onboarding group (sg-passwordless-onboarding), then issue at the desk:
Connect-MgGraph -Scopes "UserAuthenticationMethod.ReadWrite.All"
$body = @{
isUsableOnce = $true # single-use bootstrap
lifetimeInMinutes = 60 # within policy min/max
startDateTime = (Get-Date).ToUniversalTime().ToString("o")
}
New-MgUserAuthenticationTemporaryAccessPassMethod `
-UserId "newhire@contoso.com" -BodyParameter $body |
Select-Object TemporaryAccessPass, LifetimeInMinutes, IsUsableOnce, StartDateTime
# TemporaryAccessPass LifetimeInMinutes IsUsableOnce StartDateTime
# ------------------- ----------------- ------------ -------------
# w8k+P2vq 60 True 2026-06-08T05:31:00Z
The user takes the code to https://aka.ms/mysecurityinfo, signs in, and registers a passkey — a TAP sign-in counts as fresh strong auth, satisfying the 5-minute MFA-freshness gate. What TAP does and does not cover:
| Scenario | TAP works? | Notes |
|---|---|---|
| Browser sign-in to Entra-protected apps | Yes | Primary use |
| Security info registration (interrupt or direct) | Yes | The intended purpose |
| Windows OOBE — Entra join, Intune enrollment, WHfB provisioning | Yes | The new-device day-one flow |
| Windows 11 desktop sign-in via Web sign-in | Yes | Requires Authentication/EnableWebSignIn |
| Setting up Authenticator / registering a passkey | Yes | The bootstrap chain |
| On-prem AD-integrated apps (Kerberos/NTLM/LDAP) | No | TAP is cloud-only; nothing to exchange at a DC |
| Legacy/basic auth protocols | No | TAP rides modern auth only |
| B2B guest users | No | Issue nothing; guests bring home-tenant credentials |
| Standing “second factor” for daily use | Anti-pattern | Multi-use, long-lived TAPs recreate a static password |
Two operational rules keep TAP from becoming your new weakest link: audit every issuance (alert when a TAP is created for any privileged user — that is exactly what an attacker with a hijacked helpdesk session would do), and verify identity out-of-band before issuing (video + manager confirmation, in-person for Tier-0). The TAP desk is now your de facto identity-proofing function; helpdesk social engineering took down household-name companies precisely here.
On-prem resource access: cloud Kerberos trust end to end
The rollout-stalling question: “with no password, how does the user open \\files.corp.contoso.com\finance?” Answer: cloud Kerberos trust. Entra ID holds a key pair for your AD domain and mints a partial TGT at sign-in; the Windows client exchanges it at a domain controller for a full TGT, and Kerberos proceeds normally — service tickets, SMB, IIS Windows auth — with no password anywhere in the chain. One Set-AzureADKerberosServer run powers both WHfB cloud Kerberos trust and FIDO2 security-key on-prem SSO.
| Requirement | Detail | How to check |
|---|---|---|
| DCs | Windows Server 2016+, fully patched, enough per AD site to absorb TGT exchanges | Patch inventory; DC capacity per site |
| Kerberos encryption | AES256 (AES256_HMAC_SHA1) enabled for the domain / krbtgt objects |
msDS-SupportedEncryptionTypes; do not force RC4 |
| Entra Connect | Syncing onPremisesSamAccountName, onPremisesDomainName, onPremisesSecurityIdentifier |
Default sync rules include them — verify no custom rule strips them |
| Clients | Windows 10 21H2+ / Windows 11, Entra joined or hybrid joined | dsregcmd /status |
| Kerberos object | One AzureADKerberos object per AD domain, tenant-bound |
Get-AzureADKerberosServer |
| Admin rights to create | Domain Admin + Enterprise Admin on-prem, Hybrid Identity Administrator in Entra | PIM activation for the change window |
| Key hygiene | Rotate the krbtgt_AzureAD keys on your krbtgt cadence (90–180 days typical) |
Change-calendar entry + the rotation cmdlet |
| Privileged accounts | Blocked from partial-TGT redemption by design (RODC-style Password Replication Policy denies privileged groups) | Expected behavior — do not “fix” it |
Create the object once per domain that contains synced users, from a box with the Entra Connect RPC DLLs:
[Net.ServicePointManager]::SecurityProtocol = `
[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
Install-Module -Name AzureADHybridAuthenticationManagement -AllowClobber
$domain = $env:USERDNSDOMAIN
$upn = "kerbadmin@contoso.onmicrosoft.com" # Hybrid Identity Administrator
$domainCred = Get-Credential # Domain Admin / Enterprise Admin
# Creates CN=AzureADKerberos in OU=Domain Controllers and publishes it to Entra ID
Set-AzureADKerberosServer -Domain $domain -UserPrincipalName $upn -DomainCredential $domainCred
# Verify: KeyVersion must equal CloudKeyVersion, Id must equal CloudId
Get-AzureADKerberosServer -Domain $domain -UserPrincipalName $upn -DomainCredential $domainCred |
Select-Object Id, CloudId, KeyVersion, CloudKeyVersion, DomainDnsName
# Rotate on your krbtgt cadence — ONLY with this cmdlet, so AD and Entra stay in sync
Set-AzureADKerberosServer -Domain $domain -UserPrincipalName $upn `
-DomainCredential $domainCred -RotateServerKey
The object is strictly one per domain and tenant-bound: running the cmdlet for a second tenant in the same domain overwrites the first — there is no shared-domain, two-tenant configuration. And the RODC-style Password Replication Policy denies privileged built-in groups (Domain Admins et al.) from redeeming partial TGTs. That is not a bug to relax; it is the control that stops an Entra compromise from minting Tier-0 Kerberos tickets. Privileged AD work happens from privileged access workstations with separate on-prem-mastered accounts.
Edge cases to pre-map before any enforcement wave:
| Scenario | Supported with passwordless? | Route |
|---|---|---|
| RDP by supplying FIDO2/WHfB creds to any host | No | Not a supported credential type for supplied-cred RDP |
| RDP to Entra-joined hosts / AVD / Cloud PC | Yes | enablerdsaadauth:i:1 in the RDP file — Entra auth, passkey-capable |
| Using a FIDO2 key inside an RDP session | Yes | WebAuthn redirection in the Windows RDP client |
| RDP with the WHfB credential to AD hosts | Yes | Remote Credential Guard, or a certificate enrolled into the WHfB container |
| Privileged accounts needing on-prem SSO | Blocked by design | Separate tier-0 workstation + on-prem account flow |
| ROPC / basic-auth / single-factor legacy apps | No | Named CA exclusion + compensating controls + a deprecation date |
That last row deserves its own sentence in the program charter: do not let one POP3 app hold 28,000 users on passwords. Give every legacy carve-out the tightest compensating control you can, an owner, and a decommission date.
The rollout program: personas, waves, and the registration campaign
Passwordless fails as a big-bang and succeeds as a program. The sequencing logic is fixed: register before you enforce, enforce per cohort, gate each wave on data.
| Wave | Population | Actions | Enforcement state | Exit criteria (measured, not felt) |
|---|---|---|---|---|
| 0 — Foundations (wk 1–2) | Platform team | Enable methods scoped to pilot groups; TAP policy; Kerberos object per domain; WHfB Intune profile to a device ring; break-glass verified | None | Kerberos object healthy in every domain; WHfB provisions on 10 test devices; TAP issuance runbook tested |
| 1 — Admins (wk 2–4) | Tier-0, IT ops (~1–2%) | Issue two keys each, in person; register via TAP; PIM-protect the policy roles | Block — phishing-resistant strength on admin roles | 100% of Tier-0 with ≥2 registered keys; zero admin password sign-ins for 7 days |
| 2 — Pilot (wk 4–6) | 5% cross-section + execs + no-TPM fleet | WHfB silent provisioning; keys to no-TPM users; helpdesk shadowing | Report-only on the cohort | ≥95% cohort passwordless-capable; report-only shows <2% would-fail; on-prem SSO verified per site |
| 3 — Knowledge workers (wk 6–10) | ~60–70% | Registration campaign on; wave comms; TAP desk staffed to volume | Report-only 2 weeks → Block per sub-cohort | ≥90% registration before flip; helpdesk tickets <1% of cohort/week |
| 4 — Frontline + long tail (wk 10–13) | Frontline, field, contractors | Shared-PC key sign-in; Authenticator passkeys; legacy-app carve-outs signed | Block, with named exclusions | Every exclusion has an owner + expiry date |
| 5 — Password de-emphasis (wk 13+) | Cohorts at ≥95% passwordless usage | Passwords to never-expire + scramble; disable SMS/voice; SSPR scope-down | Sustained | Password sign-in share <1% and flat; then keep it there |
Wave 1 goes first and hardest for a reason: admins are the highest-value targets, the smallest blast radius, and walkable to a desk. Block-mode on Tier-0 in week 3 forces every operational gap — TAP flow, key logistics, break-glass drill — to surface while the audience is IT itself.
The registration campaign (Authentication methods → Registration campaign) is the wave-3 scale lever — it interrupts eligible sign-ins with a guided setup flow:
| Campaign setting | Value / range | Program guidance |
|---|---|---|
| State | Microsoft managed / Enabled / Disabled | Enabled, scoped per wave group |
| Days allowed to snooze | 0–14 (0 = register now, no snooze) | 3 during comms window, then 0 |
| Snooze limit | After 3 snoozes, registration is required | Say this in the comms — surprises breed tickets |
| Include / exclude targets | Groups | Mirror your wave groups exactly |
| Method nudged | Authenticator setup; passkey setup where your passkey policy allows the Authenticator AAGUIDs | Keep the FIDO2 policy and campaign scope consistent |
| Where it appears | Interrupt during eligible browser/app sign-ins | Kiosk/shared accounts should be excluded |
Around the mechanics, run it like a product launch: named champions per department, a two-minute registration video recorded on your tenant (the number-one user fear is “is this prompt a phish?” — a healthy instinct to encourage), a TAP desk capacity plan sized to wave-3 volume, and a standing dashboard reviewed in a weekly wave-gate meeting. The wave does not flip to block because the calendar says so; it flips because the registration report says so.
Enforcement: authentication strengths and killing the password fallback
Enabling methods requires nothing of anyone. The enforcement lever is a Conditional Access policy with the Require authentication strength grant control. Three built-in strengths exist, immutable, with well-known IDs:
| Built-in strength | Well-known ID | Satisfied by | Use in this program |
|---|---|---|---|
| Multifactor authentication | 00000000-0000-0000-0000-000000000002 |
Every MFA combo incl. password+SMS | Baseline only — equals the classic Require MFA grant |
| Passwordless MFA | 00000000-0000-0000-0000-000000000003 |
WHfB, FIDO2, Authenticator phone sign-in, CBA | Transitional cohorts still on phone sign-in |
| Phishing-resistant MFA | 00000000-0000-0000-0000-000000000004 |
windowsHelloForBusiness, fido2, x509CertificateMultiFactor (incl. macOS Platform Credential) |
The destination for every wave |
Pull them rather than guessing, then bind in report-only:
Connect-MgGraph -Scopes "Policy.Read.All","Policy.ReadWrite.ConditionalAccess"
$pr = Get-MgPolicyAuthenticationStrengthPolicy |
Where-Object { $_.PolicyType -eq 'builtIn' -and $_.DisplayName -eq 'Phishing-resistant MFA' }
$params = @{
DisplayName = "CA04 - Phishing-resistant MFA - wave 3 cohort"
State = "enabledForReportingButNotEnforced" # flip to 'enabled' at wave gate
Conditions = @{
Users = @{
IncludeGroups = @("<sg-wave3-object-id>")
ExcludeUsers = @("<break-glass-1-id>", "<break-glass-2-id>")
}
Applications = @{ IncludeApplications = @("All") }
}
GrantControls = @{
Operator = "OR"
AuthenticationStrength = @{ Id = $pr.Id }
}
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $params
The same layer as code, where Terraform does have first-class resources:
resource "azuread_authentication_strength_policy" "pr_company_keys" {
display_name = "PR - phishing-resistant (company methods)"
description = "WHfB + FIDO2 only; CBA excluded (no smart-card estate)"
allowed_combinations = ["windowsHelloForBusiness", "fido2"]
}
resource "azuread_conditional_access_policy" "ca02_admins_pr" {
display_name = "CA02 - Phishing-resistant MFA - privileged roles"
state = "enabled"
conditions {
client_app_types = ["all"]
applications { included_applications = ["All"] }
users {
included_roles = ["62e90394-69f5-4237-9190-012177145e10"] # Global Administrator template ID
excluded_users = var.break_glass_object_ids
}
}
grant_controls {
operator = "OR"
authentication_strength_policy_id = azuread_authentication_strength_policy.pr_company_keys.id
}
}
Custom strengths go further: the FIDO2 combination accepts advanced configuration restricting acceptable AAGUIDs, so “phishing-resistant with a company-issued key” becomes an enforceable requirement for crown-jewel apps:
# Add an AAGUID-scoped combination configuration to a custom strength
POST https://graph.microsoft.com/v1.0/identity/conditionalAccess/authenticationStrength/policies/{policyId}/combinationConfigurations
{
"@odata.type": "#microsoft.graph.fido2CombinationConfiguration",
"appliesToCombinations": ["fido2"],
"allowedAAGUIDs": ["2fc0579f-8113-47ea-b116-bb5a8db9202a", "ee882879-721c-4913-9775-3dfcce97072a"]
}
Two rules protect you from self-inflicted outages. You cannot combine Require MFA and Require authentication strength in one policy — the MFA built-in strength is Require MFA; run separate policies per concern. And CA evaluates after primary authentication: a strength does not remove the password prompt; it refuses tokens until a qualifying method is presented. Killing the prompt is the demotion work below.
The policy set, as a family:
| Policy | Scope | Control | State path |
|---|---|---|---|
| CA01 — Guard security-info registration | All users, “Register security information” user action | Require compliant device OR trusted location (TAP flow satisfies MFA itself) | Enabled from wave 0 |
| CA02 — Admin phishing-resistant | Privileged directory roles | Phishing-resistant strength | Block from wave 1 |
| CA03 — Baseline MFA | All users | MFA strength | Pre-existing, retained |
| CA04…n — Wave cohort phishing-resistant | sg-wave-N groups |
Phishing-resistant strength | Report-only 2 wks → enabled |
| CA10 — Block legacy authentication | All users | Block | Enabled from wave 0 |
| CA11 — Crown-jewel apps | Finance/ERP/admin portals via auth context | Custom strength (AAGUID-scoped) | Enabled at wave 3 |
| All of the above | — | Exclude break-glass + Entra Connect sync accounts | Always |
CA01 matters more than it looks: the security-info registration flow is exactly what an AiTM attacker uses to enroll their authenticator on a hijacked session. Locking registration to compliant devices or trusted networks (see Gating Microsoft 365 with Endpoint Conditional Access: Compliance Policies, Device Filters, and Require-Compliant Enforcement) closes the hole TAP onboarding would otherwise widen.
Killing the password fallback
“Passwordless” with a fully live password is a UX project, not a security one. The demotion levers, in deployment order:
| Lever | Mechanism | Scope | Caveat |
|---|---|---|---|
| System-preferred MFA | Entra auto-prompts the strongest registered second factor | Tenant | Affects second factor only, not primary |
| Windows passwordless experience | Authentication/EnablePasswordlessExperience CSP hides the password credential provider |
Entra-joined Windows 11 22H2+ | User-facing sign-in/CredUI; local admin paths remain |
| Web sign-in | Authentication/EnableWebSignIn — TAP/passkey desktop sign-in |
Entra-joined Windows 11 | Frontline/kiosk enabler |
| Password never expires | Domain-level validity → effectively infinite | Per domain / per user | Stops rotation prompts from resurrecting password muscle memory (NIST 800-63 aligned) |
| Scramble passwords | Rotate passwordless cohort to random 64+ char values nobody knows | Scripted, per cohort | Check app-password dependencies and on-prem writeback expectations first |
| Disable weak methods | Turn off SMS/voice/email OTP in the auth methods policy as coverage rises | Method policy | The legacy per-user MFA and SSPR policies retired Sept 30, 2025 — finish that migration first |
| Block legacy auth | CA policy (CA10) | Tenant | Passwords’ biggest abuse channel is IMAP/SMTP basic auth |
| Entra password protection + smart lockout | Banned-password lists, lockout tuning | Tenant + on-prem agents | Guards the residual surface you cannot remove yet |
| SSPR scope-down | Passwordless users do not need password reset; keep SSPR for the shrinking password cohort | SSPR policy | Do not disable the TAP-based recovery path by accident |
# Never-expire at the domain level (stops forced rotation for everyone on the domain)
Update-MgDomain -DomainId "contoso.com" -PasswordValidityPeriodInDays 2147483647
# Or per user, for cohort-by-cohort demotion
Update-MgUser -UserId "ada@contoso.com" -PasswordPolicies "DisablePasswordExpiration"
The honest footnote: you cannot delete a cloud user’s password today, and hybrid users always have one in AD. “Password-free” is an asymptote — the measurable endpoint is zero password usage, enforced strengths everywhere that matters, and a scrambled secret nobody knows guarding the rest.
Reporting and registration insights: gate every wave on data
Every wave-gate decision is a query, not a vibe. Where each answer lives:
| Question | Where | What you get |
|---|---|---|
| Who is registered for what? | Entra admin center → Protection → Authentication methods → Activity (Registration tab); Graph userRegistrationDetails |
Per-user methods, MFA/passwordless capability flags |
| Is the wave cohort ready to enforce? | Graph filter isPasswordlessCapable eq false against the wave group |
The exact remediation list |
| What are people actually signing in with? | Sign-in logs → Authentication details; SigninLogs KQL |
Method mix over time |
| Who still types passwords? | SigninLogs KQL (below) |
Straggler list with last-password-use date |
| Will the CA policy break anyone? | CA → Insights and reporting (report-only workbook) | Would-block counts per policy before you flip |
| Did anyone register a suspicious method? | Audit logs, Category == "UserManagement", security-info operations |
Registration events for alerting |
The Graph pull that produces each wave’s remediation list:
Connect-MgGraph -Scopes "AuditLog.Read.All","UserAuthenticationMethod.Read.All"
# Everyone in scope who is NOT yet passwordless-capable, with what they do have
Get-MgReportAuthenticationMethodUserRegistrationDetail `
-Filter "isPasswordlessCapable eq false" -All |
Select-Object UserPrincipalName, IsMfaRegistered, MethodsRegistered |
Export-Csv wave3-remediation.csv -NoTypeInformation
And the two KQL views on the standing dashboard (Log Analytics, SigninLogs diagnostic setting required):
// Method mix trend — the program's single most important chart
SigninLogs
| where TimeGenerated > ago(30d) and ResultType == 0
| mv-expand ad = AuthenticationDetails
| extend method = tostring(ad.authenticationMethod)
| where isnotempty(method)
| summarize signins = count() by method, bin(TimeGenerated, 1d)
| render timechart
// Who still types passwords, and when they last did — wave-5 demotion gate
SigninLogs
| where TimeGenerated > ago(14d) and ResultType == 0
| mv-expand ad = AuthenticationDetails
| where tostring(ad.authenticationMethod) == "Password"
| summarize passwordSignins = count(), lastPasswordUse = max(TimeGenerated)
by UserPrincipalName, AppDisplayName
| order by passwordSignins desc
The sign-in logs’ authentication details carry the method names verbatim — Windows Hello for Business, FIDO2 security key, Passkey (device-bound), Passwordless phone sign-in, Temporary Access Pass — exactly the granularity CA-strength debugging needs. Wire the audit-log “User registered security info” events into alerting for privileged accounts: a new method on a Global Admin that the TAP desk did not create is an incident, full stop.
Architecture at a glance
Picture the estate in two planes. The data plane is a single sign-in, end to end: a user at a hybrid-joined laptop touches a fingerprint reader (WHfB) or taps a security key. The gesture unlocks a private key in the TPM or key hardware; the platform performs the WebAuthn assertion against login.microsoft.com, the origin check making any proxied page cryptographically inert. Entra ID validates the assertion against the Passkey (FIDO2) policy and matching profile (AAGUID allowed, attestation on file), Conditional Access confirms the method satisfies the wave’s phishing-resistant strength, and token issuance follows: access/refresh tokens for the app, a Primary Refresh Token for device-wide SSO, and — because the tenant has an Entra Kerberos object — a partial TGT alongside. When the user opens \\files.corp\finance, Windows silently exchanges that partial TGT at the nearest domain controller for a full TGT and an SMB service ticket. The share opens. No password existed at any hop.
The control plane wraps that flow: Intune (or GPO) pushes WHfB and security-key sign-in settings to device rings; the authentication methods policy and its three passkey profiles define what each persona may register; the TAP desk and Graph automation mint bootstrap credentials; Conditional Access policies CA01–CA11 gate registration and enforce strengths per wave, break-glass excluded everywhere; and the telemetry loop — sign-in and audit logs in Log Analytics, registration details from Graph — decides when each wave flips from report-only to block. Every object is code-manageable (Graph JSON, Terraform, Settings Catalog values, PowerShell for the Kerberos object); treat the set as one versioned system, because drift in any layer surfaces as “user can’t sign in” three layers away.
Real-world scenario
A global manufacturer — ~28,000 staff, single AD forest with two child domains, Entra hybrid join, number-matching MFA fully deployed — lost three finance mailboxes in one quarter to an AiTM kit that relayed the number match in real time. The CISO’s mandate: phishing-resistant primary authentication for everyone in 90 days. Week one’s hardware audit surfaced the constraint that nearly sank it: roughly 1,400 shop-floor PCs had TPMs disabled in OEM firmware, so WHfB with RequireSecurityDevice=true could not provision there, and BIOS-touring 1,400 machines was not happening inside the window.
The platform team split by capability instead of forcing one credential: ~24,000 TPM-capable PCs got WHfB cloud Kerberos trust via Settings Catalog in four device rings; the 1,400 no-TPM machines plus all 240 Tier-0/IT-ops admins got company-issued FIDO2 keys under an allow-listed, attestation-enforced profile; ~2,300 field staff got Authenticator passkeys through the registration campaign. Wave 1 enforced block-mode on admins in week 3 — promptly catching a real gap: two RDP jump hosts refused the new credentials, and the fix (Entra-joined replacements with enablerdsaadauth:i:1 plus WebAuthn redirection) landed while the blast radius was 240 people who all knew the project lead’s number.
The make-or-break detail was the on-prem SSO gate on the no-TPM fleet: those PCs ran a Kerberos-authenticated MES web app, and a passwordless sign-in that could not reach it would have stopped the line. The team gated wave 2 on Get-AzureADKerberosServer health (KeyVersion == CloudKeyVersion in both child domains) and a scripted klist check across 40 pilot machines per site. One self-inflicted incident made the retro: in week 8, security tightened the admin profile’s AAGUID allow-list after 43 early adopters had registered an older key model — locking them out overnight, because key restrictions apply to authentication, not just registration. Recovery was TAP reissuance plus re-registration, and allow-list changes moved into change management with a registered-credential impact query as a mandatory pre-check.
Final numbers: phishing-resistant coverage 0 → 96% in 71 days, the residual 4% being three legacy apps on named exclusions with signed deprecation dates. Password sign-in share fell from 71% to 3.8% by day 90, TAP desk load peaked at 340/day in wave 3 (five agents), reset tickets dropped 38% quarter-over-quarter, and credential-phishing incidents since enforcement: zero.
Advantages and disadvantages
| Advantages | Disadvantages |
|---|---|
| Eliminates AiTM/credential phishing for covered sign-ins — the attack class, not an instance of it | Passwords still exist; demotion is a long tail you must actively manage |
| One-gesture MFA: faster sign-in than password+OTP (typically 2–4 s vs 25–40 s) | Hardware cost and logistics for key populations (₹1,700–8,000/user + spares) |
| WHfB covers the majority at zero marginal cost on existing TPMs | Per-device credential model — WHfB fits shared devices poorly |
| Kills password-reset ticket volume as usage falls | TAP desk becomes an identity-proofing function you must staff and harden |
| Cloud Kerberos trust delivers on-prem SSO with no PKI/AD FS | Hybrid edge cases (supplied-cred RDP, legacy protocols) need explicit routes |
| AAGUID + attestation makes “company-issued hardware only” enforceable policy | Allow-list changes are revocation events; governance overhead is real |
| Auth strengths give per-cohort, per-app enforcement granularity | Requires P1 licensing and disciplined CA hygiene (break-glass, report-only) |
The disadvantages column is a project-plan checklist, not a rebuttal — every row has a section above that neutralizes it. One strategic caution: the registration campaign, TAP desk, and comms are 60% of the effort and 90% of the user experience.
Hands-on lab: pilot group to enforced phishing-resistant MFA
Runs in any Entra tenant where you hold the Global Administrator role (use a free developer/trial tenant; Conditional Access needs a P1 trial). Cost: ₹0 plus optionally one FIDO2 key — Authenticator passkeys work keyless.
1. Connect and create the pilot group.
Connect-MgGraph -Scopes "Group.ReadWrite.All","Policy.ReadWrite.AuthenticationMethod",
"UserAuthenticationMethod.ReadWrite.All","Policy.ReadWrite.ConditionalAccess","Policy.Read.All"
$grp = New-MgGroup -DisplayName "sg-passwordless-pilot" -MailEnabled:$false `
-MailNickname "sg-passwordless-pilot" -SecurityEnabled:$true
$user = Get-MgUser -UserId "pilot1@yourtenant.onmicrosoft.com"
New-MgGroupMember -GroupId $grp.Id -DirectoryObjectId $user.Id
$grp.Id # note the object ID
2. Enable Passkey (FIDO2) for the pilot group with attestation on.
$fido2 = @{
"@odata.type" = "#microsoft.graph.fido2AuthenticationMethodConfiguration"
state = "enabled"
isSelfServiceRegistrationAllowed = $true
isAttestationEnforced = $true
includeTargets = @(@{ targetType = "group"; id = $grp.Id; isRegistrationRequired = $false })
}
Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
-AuthenticationMethodConfigurationId "Fido2" -BodyParameter $fido2
3. Enable TAP for the same group (portal: Protection → Authentication methods → Temporary Access Pass → enable for sg-passwordless-pilot; or PATCH the TemporaryAccessPass configuration as in step 2).
4. Issue a one-time TAP for the pilot user.
$tap = New-MgUserAuthenticationTemporaryAccessPassMethod -UserId $user.Id -BodyParameter @{
isUsableOnce = $true; lifetimeInMinutes = 60
}
$tap.TemporaryAccessPass # e.g. "hx8k+r2m" — hand this to the "user"
5. Register a passkey as the user. In a private window, open https://aka.ms/mysecurityinfo, sign in as pilot1 with the TAP, then Add sign-in method → Passkey. Physical key: insert, touch, set the key PIN. Keyless: choose the iPhone/Android option and complete the QR + Bluetooth flow into Authenticator. Expected: a new method row (“Passkey” with the device/model name).
6. Sign in passwordless and verify the log. New private window → https://myapps.microsoft.com → Sign-in options → Face, fingerprint, PIN or security key. Then check Sign-in logs → your sign-in → Authentication details: the method shows FIDO2 security key or Passkey (device-bound), with MFA satisfied in one step.
7. Create the report-only phishing-resistant CA policy.
$pr = Get-MgPolicyAuthenticationStrengthPolicy |
Where-Object { $_.DisplayName -eq 'Phishing-resistant MFA' }
New-MgIdentityConditionalAccessPolicy -BodyParameter @{
DisplayName = "LAB - PR strength - pilot (report-only)"
State = "enabledForReportingButNotEnforced"
Conditions = @{
Users = @{ IncludeGroups = @($grp.Id) }
Applications = @{ IncludeApplications = @("All") }
}
GrantControls = @{ Operator = "OR"; AuthenticationStrength = @{ Id = $pr.Id } }
} | Select-Object Id, DisplayName, State
# Id DisplayName State
# -- ----------- -----
# 3f2a… LAB - PR strength - pilot (report-… enabledForReportingButNotEnforced
8. Confirm report-only evaluation. Sign in again as the pilot user; that sign-in’s Report-only tab shows the LAB policy as Success. Sign in from an account without a passkey and the tab shows Failure — a would-be lockout caught safely, which is the entire argument for report-only gating.
9. Pull the registration report.
Get-MgReportAuthenticationMethodUserRegistrationDetail `
-Filter "userPrincipalName eq 'pilot1@yourtenant.onmicrosoft.com'" |
Select-Object UserPrincipalName, IsPasswordlessCapable, MethodsRegistered
# UserPrincipalName IsPasswordlessCapable MethodsRegistered
# ----------------- --------------------- -----------------
# pilot1@yourtenant.onmicro… True {passKeyDeviceBound}
10. Teardown.
Get-MgIdentityConditionalAccessPolicy -Filter "startswith(displayName,'LAB - PR')" |
ForEach-Object { Remove-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId $_.Id }
Get-MgUserAuthenticationFido2Method -UserId $user.Id |
ForEach-Object { Remove-MgUserAuthenticationFido2Method -UserId $user.Id -Fido2AuthenticationMethodId $_.Id }
Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
-AuthenticationMethodConfigurationId "Fido2" -BodyParameter @{ state = "disabled" }
Remove-MgGroup -GroupId $grp.Id
Common mistakes & troubleshooting
The playbook, in the order the desk will meet them:
| # | Symptom | Root cause | Confirm | Fix |
|---|---|---|---|---|
| 1 | User cannot see “Passkey/Security key” in Security info | Method not enabled for them, exclusion group, or self-service setup = No | Auth methods policy → Fido2 targets; check user’s groups | Include the user’s group; remember excluded beats included |
| 2 | Registration fails: “This security key isn’t supported” | AAGUID not on the allow-list, or attestation enforcement rejects the model | Compare key AAGUID (vendor tool) against policy | Allow the AAGUID or issue an approved model |
| 3 | Registration keeps demanding sign-in mid-flow | The 5-minute MFA freshness gate; user authenticated too long ago or with single factor | Sign-in log for the registration attempt | Re-auth with MFA/TAP and retry within 5 min |
| 4 | Previously working key suddenly fails at sign-in | Allow-list tightened after registration — restrictions apply to auth too | Change history on the Fido2 policy; key AAGUID | Restore AAGUID or re-register on approved hardware; treat as revocation event |
| 5 | WHfB never prompts to enroll | Policy not applied, TPM absent/disabled with RequireSecurityDevice=true, or GPO/MDM conflict | Event 360 reason; dsregcmd /status; tpm.msc |
Fix scope/hardware; single policy channel per device |
| 6 | Intune WHfB profile shows success but settings don’t apply | A GPO also configures WHfB — GPO wins | gpresult /h on the device |
Remove the GPO or move the ring to GPO-only management |
| 7 | WHfB works for cloud apps; file shares prompt for credentials | Kerberos object missing/stale, attributes not synced, or DCs unpatched | dsregcmd → OnPremTgt : NO; Get-AzureADKerberosServer KeyVersion vs CloudKeyVersion |
Create/rotate the object; verify the three synced attributes |
| 8 | FIDO2 key signs into Windows but no on-prem SSO | Same Kerberos-object causes as #7, or AES256 disabled | klist shows no krbtgt; check msDS-SupportedEncryptionTypes |
Fix object/encryption; retest with klist purge |
| 9 | Admin gets cloud SSO but never on-prem tickets | PRP on the AzureADKerberos object denies privileged groups by design | User’s membership in denied built-in groups | Expected; use the tier-0 workstation flow — do not relax PRP |
| 10 | Users registered passkeys but keep typing passwords | Nothing forces the method; sign-in defaults to last-used | Method-mix KQL flat week over week | Flip the wave to enforced strength; enable Windows passwordless experience |
| 11 | Wave flip locks out a subset of the cohort | Enforced before registration reached the gate | Report-only tab of their sign-ins pre-flip | Roll back to report-only; remediate via isPasswordlessCapable eq false list |
| 12 | TAP creation fails with a policy error | User outside TAP include targets, or lifetime outside policy min/max | Method policy targets; requested lifetime | Add group / adjust lifetime within policy bounds |
| 13 | TAP sign-in loops or is blocked | A CA policy demands a strength/compliant device TAP can’t satisfy | Sign-in log → applied CA policies for the TAP attempt | Exempt the registration flow via CA01 design, not blanket exclusions |
| 14 | Passkey QR flow fails on corp laptops | Bluetooth disabled/blocked — proximity check cannot pass | BLE radio state; endpoint baseline policy | Allow BLE or issue USB keys for that population |
| 15 | RDP to jump host fails after passwordless cutover | Supplied-cred RDP doesn’t accept FIDO2/WHfB | Attempt with password works; with key fails | Entra-joined hosts + enablerdsaadauth, Remote Credential Guard, or cert-in-container |
The error and event reference for the entries above:
| Code / event | Where | Meaning | Action |
|---|---|---|---|
| AADSTS50076 | Sign-in log | MFA required but not presented | Expected during enforcement; user picks a strong method |
| AADSTS50079 | Sign-in log | User must register security info | The registration interrupt — pair with CA01 protections |
| AADSTS500121 | Sign-in log | Strong auth request failed/denied | Key removed mid-ceremony, wrong PIN, or user cancelled |
| AADSTS53003 | Sign-in log | Blocked by Conditional Access | Check which policy via the sign-in’s CA tab |
| AADSTS50155 | Sign-in log | Device authentication failed | Stale device object or broken PRT — re-register device |
| Event 358 | User Device Registration log | WHfB provisioning will launch | Healthy — enrollment UX follows |
| Event 360 | Same | Provisioning will NOT launch + failed prerequisite | Read the listed prerequisite; it names the fix |
| Event 300 | Same | WHfB key registered with Entra | Provisioning success marker for scripts |
NotAllowedError (browser) |
WebAuthn ceremony | Policy restriction, timeout, or user cancel | Correlate with #2/#4; retry with approved key |
Best practices
- Two phishing-resistant credentials per human, from day one. WHfB + key, or two keys for Tier-0. One credential plus enforcement equals a lockout ticket with interest.
- Enforce attestation and AAGUID allow-lists for privileged users; keep Default permissive-but-device-bound. Assurance where it pays.
- Treat allow-list edits as change-managed revocation events. Query registered credentials by AAGUID before tightening; notify affected users; sequence a re-registration window.
- Report-only for two weeks before every block flip, gated on the registration report. The would-fail count in the CA insights workbook is your go/no-go number.
- Never expire PINs, never complexity-load them. TPM anti-hammering already does the work; friction here poisons adoption.
- Gate on-prem-dependent waves on Kerberos-object health.
KeyVersion == CloudKeyVersionis a pre-cutover check; rotation goes on the krbtgt calendar. - Run the TAP desk like an identity-proofing function. Out-of-band verification scripts, one-time short TAPs, issuance audit alerts on privileged targets.
- Exclude break-glass and the Entra Connect sync account from every strength policy, and drill the break-glass sign-in quarterly.
- Put every exclusion on a clock. Legacy carve-outs get an owner, a compensating control, and an expiry date.
- Instrument before you enforce. The method-mix timechart and password-straggler query exist from wave 0, or you are flying blind.
Security notes
The rollout machinery is itself an attack surface. An attacker who social-engineers your helpdesk into minting a TAP has bypassed every passkey you deployed — TAP creation for privileged accounts needs out-of-band verification and real-time alerting. The security-info registration flow is the second hole: an AiTM session that reaches registration can enroll the attacker’s authenticator, which is why CA01 ships in wave 0 and registration alerts on admin accounts are non-negotiable. Guard the control plane with PIM: Authentication Policy Administrator can rewrite your AAGUID lists, Privileged Authentication Administrator can mint TAPs for Global Admins — both deserve approval-gated activation, as designed in Privileged Identity Management and PAM Architecture: Just-in-Time Access at Scale.
Do not weaken the deliberate boundaries. The AzureADKerberos object’s PRP denial of privileged groups is the firewall between “Entra tenant compromised” and “AD forest compromised” — relaxing it for an admin’s file-share convenience reopens the escalation path cloud Kerberos trust exists to close; keep tier-0 AD administration on separate on-prem-mastered accounts and privileged access workstations. Break-glass accounts stay excluded from every strength policy, hold their own FIDO2 keys in dual-controlled storage, and alert on every use — full design in Engineering Break-Glass Emergency Access Accounts in Entra ID: Exclusions, Hardening, and Tamper-Evident Monitoring.
Residual password surface stays a live wire until wave 5 completes. Keep smart lockout, Entra password protection, and the legacy-auth block active while any password can authenticate anywhere, and pair enforcement with risk-based response from Operationalizing Entra ID Protection: Risk-Based Conditional Access, Detection Tuning, and Risk Investigation. Revocation must be a five-minute runbook: delete the lost credential’s method object, Revoke-MgUserSignInSession to kill refresh tokens, issue a one-time TAP for re-registration — a found-in-a-taxi key deleted from the user object is inert hardware.
Cost & sizing
The methods are free; the money is in hardware, licensing you mostly already own, and desk time — offset by the password-reset tickets you stop paying for.
| Item | Indicative unit cost | Notes |
|---|---|---|
| YubiKey 5 NFC | ~US$50 / ₹4,300 | The default corporate issue |
| Security Key NFC by Yubico | ~US$25–29 / ₹2,200–2,500 | FIDO2-only budget line |
| FEITIAN ePass (K9/K40 class) | ~US$18–30 / ₹1,600–2,600 | Budget alternative; verify AAGUIDs per model |
| YubiKey Bio | ~US$90–95 / ₹7,800–8,300 | On-key fingerprint UV; shared-desk premium |
| Spares / attrition budget | 10–15% of key fleet per year | Lost, washed, left-in-laptop |
| WHfB / Authenticator passkeys | ₹0 | Rides existing TPMs and phones |
| TAP, auth methods policy, reports | ₹0 (included) | Registration/usage dashboards light up with P1 |
| Entra ID P1 | ~US$6 / ₹500 per user/month (list) | CA + auth strengths; in M365 E3/Business Premium |
| Entra ID P2 | ~US$9 / ₹750 per user/month (list) | Only for Identity Protection/PIM add-ons |
Sizing a 5,000-user program: keys for ~12% (admins, no-TPM, frontline, execs) = 600 × ₹4,300 ≈ ₹25.8 lakh plus 15% spares; WHfB covers ~3,800 users at ₹0 marginal; Authenticator passkeys the rest. Against that, price the run-rate you retire: at 0.5–1.0 password-reset tickets per user per year and ₹800–1,200 fully loaded per ticket, a 5,000-user org spends roughly ₹20–60 lakh/year on resets — a 35–40% reduction pays for the key fleet inside year one, before counting a single avoided phishing incident. Right-size the desk too: wave-3 TAP throughput (≈60–80/agent/day) is the real bottleneck.
Interview & exam questions
Mapped to SC-300, SC-100, AZ-500, and MS-102 where WHfB/Intune surfaces.
-
Why is a FIDO2 passkey phishing-resistant when number-matching push is not? The WebAuthn assertion is origin-bound: the authenticator signs only if the browser’s actual origin matches the credential’s RP ID, so an AiTM proxy’s domain fails cryptographically with no user judgment involved. Number matching still relies on the user approving a session an attacker initiated — a relay defeats it.
-
Compare the three WHfB trust models and justify a default. Cloud Kerberos trust: Entra mints a partial TGT, no PKI or AD FS, immediate SSO — the default. Key trust: DCs validate the synced public key; needs DC certificates and waits on Entra Connect sync. Certificate trust: user certificates via AD FS + PKI — heaviest, but native RDP. Pick cloud Kerberos trust unless certificates are a hard requirement.
-
Walk the flow from fingerprint touch to an open on-prem file share. Gesture unlocks the TPM-held key → WebAuthn assertion to Entra → tokens + PRT + partial TGT (encrypted to the krbtgt_AzureAD keys) → partial exchanged for a full TGT at a DC → SMB service ticket → share opens. No password at any hop.
-
What do attestation enforcement and key restrictions each guarantee, and what does neither guarantee? Attestation cryptographically proves authenticator make/model at registration; key restrictions allow/block specific AAGUIDs at registration and authentication. Neither says anything about which individual key or its custody — serial-level tracking is your asset process.
-
Design TAP for onboarding without creating a new weak link. One-time, 60-minute passes with the policy maximum capped low; issuance restricted to PIM-activated Authentication Admins (Privileged Auth Admin for admin targets); out-of-band identity verification; audit alerts on privileged-target TAPs; registration gated by a CA policy on the security-info user action.
-
Why can’t Require MFA and Require authentication strength combine in one CA policy, and what’s the design consequence? The built-in MFA strength is the Require MFA control — combining them is redundant/contradictory, so the API forbids it. Consequence: run separate policies per concern (baseline MFA for all, strengths per cohort/app) rather than piling grants into one mega-policy.
-
A privileged admin reports no on-prem SSO after passwordless sign-in. Bug or design? Design. The AzureADKerberos object behaves like an RODC whose Password Replication Policy denies privileged built-in groups, blocking partial-TGT redemption — deliberately breaking Entra-to-AD escalation. The answer is a separate tier-0 on-prem admin flow, never relaxing the PRP.
-
“Passwordless is not password-free” — name the levers that actually shrink password usage. Enforced strengths per wave; system-preferred MFA; Windows passwordless experience; never-expiring then scrambled passwords for converted cohorts; disabling SMS/voice; blocking legacy auth; SSPR scope-down — all measured by the password-usage KQL trending to zero.
-
Synced vs device-bound passkeys: where is each acceptable? Both are origin-bound and phishing-resistant. Synced passkeys replicate through consumer clouds with no attestation — provenance and copy-count unverifiable — so they fit low-privilege convenience only; privileged roles get attested device-bound hardware enforced via profile + attestation + AAGUID list.
-
Which reports gate a wave flip from report-only to enforced? Graph
userRegistrationDetailsfilteredisPasswordlessCapable eq falseagainst the wave group (the remediation list), the CA report-only insights workbook (would-block count), and the sign-in-log method mix confirming actual passkey usage — flip when registration ≥ target and would-fail < threshold.
Quick check
- A user registered a YubiKey last month; today security removed its AAGUID from the allow-list. What happens at their next sign-in?
- Which single
dsregcmd /statusfield tells you cloud Kerberos trust delivered a partial TGT? - Your Intune WHfB profile reports success but devices don’t enroll, and the fleet is hybrid-joined. First suspect?
- Why does the phishing-resistant strength policy still allow the password prompt to appear at sign-in?
- Name the two hard limits on passkey profiles.
Answers
- The sign-in fails — key restrictions apply to authentication as well as registration; the change was a de facto revocation of that credential.
OnPremTgt : YESin the SSO State section (withCloudTgt : YESalongside).- A GPO also configuring WHfB — Group Policy silently wins over MDM for WHfB on hybrid-joined devices; check
gpresult. - CA evaluates after primary authentication — the strength refuses tokens until a qualifying method is presented but does not alter the sign-in page. Removing the prompt is demotion work (passwordless experience policy, method disables).
- Maximum three profiles (including Default) and a 20 KB policy-document ceiling.
Glossary
- AAGUID — Authenticator Attestation GUID; the 128-bit make/model identifier every FIDO2 authenticator reports, used in allow/block lists.
- Attestation — Cryptographic statement, verified at registration, proving an authenticator’s make/model; absent from synced passkeys.
- Cloud Kerberos trust — WHfB/FIDO2 hybrid model where Entra ID issues a partial TGT redeemed at on-prem DCs; no PKI or AD FS.
- Discoverable credential — FIDO2 credential stored on the authenticator, enabling usernameless sign-in; consumes finite key slots.
- Entra Kerberos object (AzureADKerberos) — RODC-style computer object +
krbtgt_AzureADaccount, one per AD domain, enabling partial-TGT exchange. - Partial TGT — Kerberos ticket-granting ticket minted by Entra ID, exchanged at a DC for a full TGT during passwordless on-prem SSO.
- Passkey — Industry name for a FIDO2/WebAuthn discoverable credential, device-bound or synced.
- PRT (Primary Refresh Token) — Device-wide Entra SSO artifact issued at Windows sign-in; the anchor for silent app sign-ins.
- RP ID (relying party ID) — The domain a WebAuthn credential is scoped to (
login.microsoft.comfor Entra); the anchor of origin binding. - TAP (Temporary Access Pass) — Time-boxed, optionally one-time code satisfying strong auth, used to bootstrap passwordless registration.
- WHfB container — Per-user, per-device store of Windows Hello keys, unlocked by the PIN/biometric gesture.
Next steps
- Pair this rollout manual with the security-side threat model, attestation tiers, and emergency access in Rolling Out Phishing-Resistant Passwordless Auth: FIDO2, Passkeys, and Break-Glass Design.
- Build the enforcement layer properly with Designing Conditional Access at Scale: A Persona-Based Policy Framework with Authentication Context and Filters.
- Harden the accounts that survive every policy in Engineering Break-Glass Emergency Access Accounts in Entra ID: Exclusions, Hardening, and Tamper-Evident Monitoring.
- Verify the hybrid plumbing your partial TGTs depend on in Microsoft Entra Connect Sync Deep Dive: Designing Hybrid Identity with PHS, PTA, and Seamless SSO.
- Close the mobile flank with Authenticator Passkeys and Number Matching: Stopping MFA Fatigue Attacks.