Identity Bytes // IB-ENTRA-SEC Track
Advanced Lab 04 of 12 Est. 120 minutes

Phishing-Resistant Authentication with FIDO2, TAP and Windows Hello

App-based MFA stops password spray, but it does not stop a real-time phishing proxy that relays your approval. This lab deploys phishing-resistant methods for Northgate's operational support accounts: FIDO2 security keys such as YubiKeys, Temporary Access Pass for passwordless onboarding, and Windows Hello for Business, then upgrades the admin Conditional Access policy to demand them.

Section 1

Lab Metadata

Lab ID
IB-ENTRA-SEC-04
Difficulty
Advanced
Scenario Org
Northgate Financial
Estimated Time
120 minutes

Core technologies

FIDO2 / WebAuthn YubiKey Temporary Access Pass Authentication strengths Windows Hello for Business Conditional Access Microsoft Graph PowerShell
Section 2

Scenario and Description

IN PLAIN TERMS A skilled con artist can telephone you, pretend to be your bank, and talk you into reading out the one-time code from your app. That is real-time phishing, and it beats ordinary app or text codes. A physical security key is like a lock that refuses to open for anyone standing at the wrong address. It checks the real doorplate, not what a caller claims, so there is nothing for the con artist to talk out of you. This lab issues those keys to the staff attackers target most, and onboards them with a single-use day pass so no password ever changes hands.

Lab 03 enforced MFA for everyone at Northgate. That defeats the commonest attacks, but it does not defeat the most dangerous one aimed at privileged staff: adversary-in-the-middle phishing. A tool such as a reverse-proxy phishing kit sits between the user and the real Microsoft sign-in page, captures the password, relays the MFA prompt, and steals the resulting session token. App push, SMS and one-time codes are all phishable this way, because the user is tricked into completing a genuine challenge on the attacker's behalf.

Phishing-resistant methods break this. FIDO2 security keys and Windows Hello for Business use public-key cryptography bound to the real sign-in origin. The credential will not release a signature to a look-alike domain, so a proxy has nothing to relay. There is no shared secret to capture. This is why the brief calls for deploying "enhanced robust authentication, such as YubiKeys, for operational support accounts", these are the accounts an attacker most wants and most targets.

You will enable FIDO2 and Temporary Access Pass in the Authentication Methods policy, issue a Temporary Access Pass so a support engineer can bootstrap a security key with no password at all, register and verify a FIDO2 key, optionally restrict which key models are permitted, and then upgrade the CA002 admin policy from "require MFA" to "require phishing-resistant authentication strength". Finally you set up Windows Hello for Business for standard corporate devices.

Section 3

Prerequisites

Prior labs

Labs 01, 02 and 03 are required. This lab upgrades the CA002 admin policy created in Lab 03 and relies on the break-glass accounts from Lab 03 staying excluded. The Authentication Methods policy from Lab 02 is where FIDO2 and TAP are enabled.

Hardware note

INFO: completing the key ceremony Registering a FIDO2 credential is a client-side WebAuthn ceremony that needs an authenticator present. Ideally use a physical FIDO2 security key such as a YubiKey 5. If you do not have one, you can complete the registration for learning purposes with a platform authenticator (Windows Hello on the machine, or a phone passkey), the policy configuration and Graph verification are identical. The account disablement and Conditional Access steps need no hardware.

Graph scopes introduced

ScopeWhy it is needed
Policy.ReadWrite.AuthenticationMethodEnable FIDO2 and Temporary Access Pass in the policy
UserAuthenticationMethod.ReadWrite.AllIssue a Temporary Access Pass and read registered FIDO2 methods
Policy.ReadWrite.ConditionalAccessUpgrade CA002 to an authentication strength
Section 4

Real-World Problem Statement

Privileged and operational support accounts are the highest-value targets in any tenant. Protecting them with a phishable factor leaves the crown jewels one convincing email away from compromise. The problem is not only choosing a phishing-resistant method, it is onboarding people onto it without a password bootstrap that reintroduces the weakness.

DimensionWhy this matters
RiskAdversary-in-the-middle phishing defeats app and SMS MFA. Only origin-bound cryptographic credentials stop it.
CompliancePhishing-resistant MFA for privileged access is an explicit expectation in modern Zero Trust and government guidance.
ProductivityTemporary Access Pass lets support staff onboard a key in minutes without a helpdesk password reset, and passwordless sign-in is faster day to day.
Security postureMoving admins to keys removes the single most impactful attack path against the tenant.

Concrete scenario: Northgate has 30 operational support engineers with standing access to sensitive systems. The CISO wants every one of them on a hardware security key within a fortnight, onboarded without emailing passwords around, and wants the admin Conditional Access policy to reject anything less than a phishing-resistant credential.

Section 5

Skills Mapped to Production Solutions

Skill learned in this labReal-world enterprise application
Enabling and restricting FIDO2 in the policyRolling out hardware keys and allowlisting approved models by AAGUID
Issuing Temporary Access PassPasswordless onboarding and secure account recovery for support teams
Applying an authentication strength in Conditional AccessDemanding phishing-resistant credentials for privileged access
Verifying registered methods via GraphAuditing which admins actually hold hardware-backed credentials
Configuring Windows Hello for BusinessPasswordless sign-in on corporate Windows estates at scale
Section 6

Architecture Overview

The flow has two halves. Onboarding: a Temporary Access Pass lets a passwordless user register a FIDO2 key. Enforcement: Conditional Access requires an authentication strength that only phishing-resistant methods satisfy.

ONBOARDING (passwordless bootstrap) Admin issues TAP one-time, 60 min Support engineer signs in with TAP Registers FIDO2 key WebAuthn ceremony Key bound to account origin-bound credential ENFORCEMENT (every privileged sign-in) Admin sign-in jpatel (User Admin) CA002 authentication strength = Phishing-resistant MFA app push no longer satisfies it Key present access granted Only app push access blocked
PRODUCTION CONSIDERATION Deploy phishing-resistant methods to administrators and operational support first, where the risk is highest and the population is small, then widen. Always confirm each admin has registered a key before you tighten their Conditional Access policy, exactly as you confirmed MFA registration before enforcing in Lab 03.
Section 7

Step-by-Step Implementation

Phase A - Enable the phishing-resistant methods

REAL WORLD ANALOGYA FIDO2 key does not hand over a code that anyone could relay. It performs a cryptographic handshake bound to the real website's address, like a key that reads the doorplate before turning and simply refuses to turn in a counterfeit door. Attestation is the key arriving with a maker's certificate, so the building knows it is a genuine, approved model and not something cut in a market stall.

1Enable FIDO2 and Temporary Access Pass in the policy

Purpose: make hardware keys and a passwordless onboarding pass available before you onboard anyone.

Context: a Temporary Access Pass (TAP) is a time-limited code an administrator issues so a user can sign in and register a strong credential without ever using a password. It is the standard way to bootstrap passwordless.

Enable FIDO2 (with attestation) and TAP
Connect-MgGraph -Scopes 'Policy.ReadWrite.AuthenticationMethod',
  'UserAuthenticationMethod.ReadWrite.All','Policy.ReadWrite.ConditionalAccess' -NoWelcome

# --- FIDO2 security keys ---
$fido2Body = @{
  '@odata.type' = '#microsoft.graph.fido2AuthenticationMethodConfiguration'
  state = 'enabled'
  isSelfServiceRegistrationAllowed = $true
  isAttestationEnforced = $true            # require the key to prove its make and model
  includeTargets = @(@{ targetType='group'; id='all_users' })
}
Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
  -AuthenticationMethodConfigurationId 'Fido2' -BodyParameter $fido2Body

# --- Temporary Access Pass ---
$tapBody = @{
  '@odata.type' = '#microsoft.graph.temporaryAccessPassAuthenticationMethodConfiguration'
  state = 'enabled'
  defaultLifetimeInMinutes = 60
  defaultLength = 8
  isUsableOnce = $true                      # one-time use is the safer default for onboarding
  minimumLifetimeInMinutes = 10
  maximumLifetimeInMinutes = 480
  includeTargets = @(@{ targetType='group'; id='all_users' })
}
Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
  -AuthenticationMethodConfigurationId 'TemporaryAccessPass' -BodyParameter $tapBody
VERIFICATION
'Fido2','TemporaryAccessPass' | ForEach-Object {
  (Get-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
    -AuthenticationMethodConfigurationId $_) | Select-Object Id,State }
# Expected: both show State = enabled

What just happened? The tenant now permits hardware keys and can issue passwordless onboarding passes. Attestation enforcement means Entra will record the make and model of every registered key, which you use next to restrict to approved models.

Phase B - Onboard a support engineer passwordless

REAL WORLD ANALOGYA Temporary Access Pass is a one-time visitor day pass issued at the front desk: it gets you in exactly once, for an hour, so you can collect your permanent key. No password is ever written down, emailed, or spoken, which matters because the onboarding step is precisely where attackers wait to intercept credentials. Enterprises use TAPs for new joiners and for recovering staff who have lost their key.

2Issue a Temporary Access Pass to lokafor

Purpose: let the support engineer sign in and register a key without a password.

Create an operational-support group and issue a TAP
$domain = (Get-MgOrganization).VerifiedDomains | Where-Object IsDefault | Select-Object -ExpandProperty Name

# Group to hold operational support accounts (used for targeting later).
$ops = New-MgGroup -DisplayName 'Ops-Support-PhishResistant' -MailEnabled:$false `
  -MailNickname 'ops-support-pr' -SecurityEnabled:$true
$lokafor = Get-MgUser -Filter "userPrincipalName eq 'lokafor@$domain'"
New-MgGroupMember -GroupId $ops.Id -DirectoryObjectId $lokafor.Id

# Issue a one-time TAP valid for 60 minutes.
$tap = New-MgUserAuthenticationTemporaryAccessPassMethod -UserId $lokafor.Id `
  -BodyParameter @{ isUsableOnce = $true; lifetimeInMinutes = 60 }

Write-Host "TAP for lokafor: $($tap.TemporaryAccessPass)" -ForegroundColor Yellow
Write-Host "Valid until: $($tap.StartDateTime.AddMinutes(60))"
SECURITY WARNING A Temporary Access Pass is a full sign-in credential for its lifetime. Deliver it through a channel separate from the account it unlocks, for example read it out on a verified phone call, never email it to the same mailbox. Keep the lifetime short and one-time.

What just happened? lokafor can now go to the sign-in page, enter the TAP instead of a password, and reach the security-info page to add a key. No password ever changes hands, which removes the weakest link in a passwordless rollout.

3Register the FIDO2 key and verify it via Graph

Purpose: bind an origin-bound credential to the account and confirm it landed.

User ceremony, then administrator verification
# USER STEP (lokafor, in a browser):
# 1. Go to https://aka.ms/mysecurityinfo and sign in using the TAP.
# 2. Add sign-in method > Security key (or Passkey), follow the prompts,
#    touch the key when asked, and give it a name such as 'YubiKey-lokafor'.

# ADMIN VERIFICATION (Graph): read the registered FIDO2 methods.
Get-MgUserAuthenticationFido2Method -UserId $lokafor.Id |
  Select-Object DisplayName, Model, AaGuid, CreatedDateTime
VERIFICATION The command returns at least one method with a Model (for example a YubiKey 5 variant) and an AaGuid. Record that AAGUID, you use it in the optional restriction step below. An empty result means the ceremony did not complete, retry the registration.

4Optional: restrict to approved key models by AAGUID

Purpose: permit only the security-key models your organisation has vetted and purchased.

Context: an AAGUID is a 128-bit identifier for a specific authenticator make and model. Allowlisting AAGUIDs stops staff registering unknown or low-assurance keys.

Enforce an AAGUID allowlist on the FIDO2 configuration
# Populate with the AAGUIDs of models you approve. Yubico publishes these,
# and you can read one from a registered key with Get-MgUserAuthenticationFido2Method.
$approvedAaGuids = @(
  '<yubikey-5-series-aaguid>',
  '<yubikey-5-nfc-aaguid>'
)

$restrictBody = @{
  '@odata.type' = '#microsoft.graph.fido2AuthenticationMethodConfiguration'
  state = 'enabled'
  isAttestationEnforced = $true
  keyRestrictions = @{
    isEnforced = $true
    enforcementType = 'allow'     # only these AAGUIDs may register; use 'block' to deny specific ones
    aaGuids = $approvedAaGuids
  }
  includeTargets = @(@{ targetType='group'; id='all_users' })
}
Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
  -AuthenticationMethodConfigurationId 'Fido2' -BodyParameter $restrictBody
INFO Set the allowlist after your pilot users have registered, or read their AAGUIDs first, otherwise you can accidentally block the very keys you just issued. In a locked-down financial environment, an enforced allowlist plus attestation is the expected control.

Phase C - Demand phishing-resistant strength for admins

5Upgrade CA002 to require a phishing-resistant authentication strength

Purpose: make the admin Conditional Access policy reject any factor weaker than a phishing-resistant credential.

Context: an "authentication strength" is a named set of allowed methods. Entra ships three built-ins: multi-factor, passwordless MFA, and phishing-resistant MFA. You point CA002 at the phishing-resistant built-in, whose fixed id is 00000000-0000-0000-0000-000000000004.

Swap the MFA control for the phishing-resistant strength
$ca002 = Get-MgIdentityConditionalAccessPolicy `
  -Filter "displayName eq 'CA002 - Require MFA for admin roles'"

$prStrengthId = '00000000-0000-0000-0000-000000000004'  # built-in: Phishing-resistant MFA

$update = @{
  grantControls = @{
    operator = 'OR'
    builtInControls = @()
    'authenticationStrength@odata.bind' =
      "https://graph.microsoft.com/v1.0/policies/authenticationStrengthPolicies/$prStrengthId"
  }
  # Keep it report-only first if you want to preview, then set to enabled.
  state = 'enabledForReportingButNotEnforced'
}

Update-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId $ca002.Id -BodyParameter $update
CRITICAL Do not set CA002 to enabled until every targeted admin has a registered FIDO2 key or Windows Hello for Business. An admin without a phishing-resistant method will be blocked from all apps the moment this enforces. Validate in report-only, confirm each admin is key-registered, then flip to enabled. Your break-glass accounts remain excluded and are your recovery path.
VERIFICATION Sign in as jpatel with app push only, the CA002 report-only result should be reportOnlyFailure (the strength is not met). Sign in with the registered key, the result should be reportOnlySuccess. That contrast is the whole point of the control.

What just happened? The admin policy now measures the quality of the credential, not merely that some second factor happened. App push, which a proxy can relay, no longer satisfies it. Only a key or Windows Hello does.

Phase D - Windows Hello for Business

REAL WORLD ANALOGYWindows Hello for Business is your own office recognising your face at your own desk. The credential is built into the machine's secure chip and never leaves it, so there is nothing to steal in transit and nothing to phish over the phone. Staff get the passwordless convenience daily on their corporate laptop, while support engineers also carry a physical key for when they work from any other machine.

6Enable Windows Hello for Business for corporate devices

Purpose: give standard staff on managed Windows devices a phishing-resistant, passwordless sign-in without carrying a separate key.

Context: Windows Hello for Business (WHfB) provisions a device-bound biometric or PIN credential backed by the device TPM. It is configured on the device through Intune (or Group Policy), and the recommended hybrid model is cloud Kerberos trust, which lets the WHfB credential reach on-premises resources without a certificate infrastructure.

Enablement path (Intune) and what it produces
# WHfB is device-provisioned, not a single Graph call. The enablement path:
#
# 1. Microsoft Intune admin center > Devices > Enrollment >
#    Windows Hello for Business. Set 'Configure Windows Hello for Business' = Enabled.
# 2. Set PIN policy (length, complexity) and enable biometric use.
# 3. For hybrid access to on-prem resources, deploy 'cloud Kerberos trust':
#    run the Entra Kerberos server object setup on a domain controller
#    (Set-AzureADKerberosServer via the AzureADHybridAuthenticationManagement module).
#
# Result: on an enrolled Windows device, the user provisions a PIN or face/fingerprint,
# which becomes a phishing-resistant credential that satisfies the same authentication
# strength you applied to CA002.
PRODUCTION CONSIDERATION WHfB and FIDO2 keys are complementary, not competing. Corporate Windows users get WHfB for daily passwordless sign-in, while operational support and admins also carry a FIDO2 key so they can authenticate from any device, including shared or non-Windows machines. Both satisfy the phishing-resistant strength you set in Phase C.
Section 8

Testing and Validation

  1. TAP onboarding: sign in as lokafor using the issued TAP, confirm you reach the security-info page without a password.
  2. Key registration: register a key, then confirm it via Get-MgUserAuthenticationFido2Method.
  3. Strength enforcement (report-only): as jpatel, app push yields reportOnlyFailure on CA002, the key yields reportOnlySuccess.
  4. Break-glass safety: confirm CA002 still shows notApplied for break-glass before you enforce.
SymptomCauseResolution
TAP rejected at sign-inExpired, already used, or TAP method disabledConfirm TAP config is enabled, issue a fresh one-time pass
Key registration blockedAAGUID allowlist excludes the key, or attestation failedAdd the key's AAGUID to the allowlist, or relax attestation for the pilot
Admin blocked after enforcing CA002Admin had no phishing-resistant method registeredSign in via break-glass, set CA002 to report-only, register the admin's key, re-enforce
authenticationStrength@odata.bind errorMalformed bind URL or wrong strength idUse the exact built-in id and the v1.0 authenticationStrengthPolicies path
Section 9

Security Analysis

What makes this sound

Intentionally simplified for the lab

Production hardening

Section 10

Cleanup Instructions

INFO: preserve for the track Keep FIDO2, TAP and the upgraded CA002, later labs assume phishing-resistant admin access. Only revert to reset the tenant.
Revert CA002 to plain MFA and remove the ops group
$ca002 = Get-MgIdentityConditionalAccessPolicy -Filter "displayName eq 'CA002 - Require MFA for admin roles'"
Update-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId $ca002.Id -BodyParameter @{
  grantControls = @{ operator='OR'; builtInControls=@('mfa'); 'authenticationStrength@odata.bind'=$null } }

$g = Get-MgGroup -Filter "displayName eq 'Ops-Support-PhishResistant'"
if ($g) { Remove-MgGroup -GroupId $g.Id }

# Remove a test FIDO2 method if you want a clean slate:
# Get-MgUserAuthenticationFido2Method -UserId $lokafor.Id | ForEach-Object {
#   Remove-MgUserAuthenticationFido2Method -UserId $lokafor.Id -Fido2AuthenticationMethodId $_.Id }
Disconnect-MgGraph
Section 12

Key Takeaways and Next Lab

Identity Bytes // IB-ENTRA-SEC Track // Lab 04 of 12. British English. For lab and training use against a disposable tenant only.