In this post, we show how we rolled out organization-wide, passwordless YubiKey (FIDO2) authentication with Microsoft Entra ID—what worked, what didn’t, and what we’d do again. Key takeaways include: why we chose YubiKey over app-based MFA, how we managed Entra ID configuration, our approach to phased enforcement with conditional access, edge cases, onboarding, and more. Whether you’re just evaluating YubiKeys or ready to go all-in, this guide will help you get it right, securely and smoothly.
Security policy changes reshape how people work—and often face resistance. Authenticator apps are familiar; Microsoft even offers a registration campaign to nudge users toward Microsoft Authenticator as their primary MFA. There’s no equivalent, out-of-the-box campaign for YubiKeys, and end-to-end implementation guidance is scattered. So why change at all—and isn’t Microsoft Authenticator good enough?
Short answer: not if you want phishing-resistant, passwordless authentication at scale. This post explains why we enforce YubiKey (FIDO2) and exactly how to roll it out with Microsoft Entra ID, securely and with minimal friction.
A YubiKey is a small hardware security key that implements FIDO2/WebAuthn for strong, phishing-resistant authentication. Instead of push approvals or one-time codes, the key performs a public-key challenge–response that’s cryptographically bound to the site’s domain, making it resilient against Adversary-in-the-Middle (AiTM) attacks.
At Hunt & Hackett, we enforce YubiKey use because it enables true passwordless sign-in, materially reduces push-fatigue/approval phishing, and removes shared secrets from the login flow. In our environment—managed devices and in-office onboarding—it delivers high assurance with low user friction and scales well across the organization. As a bonus, it also reduces help-desk load (fewer password resets).
To frame the rollout, here’s our baseline. Before enforcing YubiKey, employees authenticated to Microsoft Entra ID using the Microsoft Authenticator app. Access to our environment was limited to Intune-managed, compliant devices: company laptops and enrolled phones (including personal phones enrolled via Intune). Our fleet included both Dell laptops (Windows) and MacBooks, but we began migrating everyone to Mac to simplify device management. For this rollout we scoped YubiKey to company-managed MacBooks and enrolled phones only. Keeping to a single desktop OS reduced testing and support overhead.
To ease adoption, we used a phased rollout: start with small pilot cohorts, fix issues, then expand before enforcing YubiKey org-wide. You can phase by (a) rolling out team-by-team and/or (b) enforcing YubiKey for specific high-risk actions first. For example, require YubiKey when requesting an Access Package or elevating a role in Privileged Identity Management (PIM).
Before starting, it is important to note that while registering the Microsoft Authenticator App to your Microsoft account can directly be done after entering a username and password, registering the YubiKey requires you to additionally authenticate with MFA. This makes the registration for YubiKey a bit more involved than that of the Microsoft Authenticator App, as we will require a form of bootstrapping authentication to enable any new employees to register the YubiKey.
Another particularity of the YubiKey is that since it is a hardware token, we may encounter users who break it, lose it, forget it at home or block their PIN (a blocked YubiKey PIN cannot be recovered, and the user must reset the FIDO functionality on their YubiKey, and register it again from scratch). We can deal with these scenarios in two ways: either we can enable business continuity by allowing a secondary form of authentication for when a user’s YubiKey is unavailable, or we can choose to implement no alternative and decide a user’s work and access are interrupted until they obtain a working YubiKey again. To decide what to do, we need to weigh both the impact on the users as well as the security implications.
As a hardware token, stock management of the YubiKey should also be considered. We need to have answers to the following questions: what type of YubiKeys should we order, how many do we keep in stock, how do we hand them out, how do we collect them when an employee offboards, and so on. Stock management responsibility may fall outside the scope of IT depending on how your organization is managed, so we omit these details from this blog post. But be aware that you need to inform the relevant teams in your organization to help you organize this!
For our lifecycle management, we will be covering three core processes:
The first lifecycle activity we will handle is the simplest – transitioning existing users to YubiKey. As mentioned earlier, registering YubiKey to your Microsoft account requires authenticating with an existing form of MFA. Existing users are already authenticating with the Microsoft Authenticator App, so we require only two actions from them:
Prior to requesting users to perform these two actions, we will enable YubiKey as an authentication method. This will allow our users to register and use YubiKey as an authentication method. Let’s start!
At this stage, users will be able to register and authenticate with the models of YubiKey that we have permitted in our organization. It is time to instruct your users to register their YubiKeys and enable password-less sign-ins on Microsoft Authenticator App. While users are slowly registering their YubiKeys, you can monitor the progress with the Microsoft Graph API, by iterating through all users in your organization and checking whether they have registered a YubiKey yet with the fido2AuthenticationMethod API.
Though users can now register and choose to authenticate with the YubiKey, it has not yet been enforced. Earlier, we discussed a phase-wise rollout to ensure all users are not immediately impacted by the sudden authentication switch from Microsoft Authenticator App to the YubiKey. Let’s implement this!
And we’re done! YubiKey has now been enforced for the subset of users/actions that we’ve chosen. Continually repeat Step 5 for wider scopes until we have covered all user groups/ actions, and YubiKey enforcement has been applied organization-wide. If you have guests in your tenant, ensure you don’t accidentally include them too when targeting all users (unless that is your intention).
Note also that when YubiKey has been enforced organization-wide, you should ensure to exclude your breakglass Microsoft accounts from this conditional access policy (and all others), to prevent it from getting locked out of Entra ID when there are any misconfigurations in conditional access policies. You can (or should) of course still register YubiKeys for breakglass accounts, as dependent on risk assessments carried out in your organization. As these breakglass accounts are being excluded from the Yubikey-enforcement conditional access policy, you should also monitor sign-in events using these accounts to ensure their usage is restricted to calamities.
Once this Conditional Access policy has been created and applied to all employees and all resources, a user logging into a target application will experience a prompt to authenticate with their YubiKey. An interaction with existing policies that target your session validity may influence how often a user may have to use their YubiKey in a day (see Microsoft’s Known issues documented here). We draw your attention to this as a YubiKey is a physical authentication device, so users may find it handy to keep their YubiKeys inserted in their laptops as long as they are sitting behind their desk. It is then also important to educate them on its removal when they leave their desk.
Moving onto another stage of the lifecycle, let’s handle the registration of authentication methods for new users. This is a more involved process, and there are a few problems we need to tackle:
How can we solve these problems while ensuring the process we design remains secure? After some thorough threat modelling, the final process we landed on was this:
Figure 1 - Device onboarding workflow
Given the chicken-and-egg dilemma of how to trust a user who has not yet set up their trusted session, we have decided to leverage an already trusted user and device, who we call the Onboarding Buddy. The Onboarding Buddy can be selected as you deem appropriate in your organization; for smaller organizations, this can be a colleague in the same team as the new employee. For larger organizations, this can be dedicated IT staff. Note that this design entails that you need to physically be next to a trusted device/colleague when onboarding; remote onboarding is thus not supported.
On onboarding day, the new employee sits with their Onboarding Buddy and authenticates with a Temporary Access Pass (TAP) to their new Microsoft account in an incognito browser session on the Onboarding Buddy’s laptop. Once authenticated, they register their YubiKey and Microsoft Authenticator App. They then enable password-less sign-ins directly on Microsoft Authenticator App on their phone, and finally, they enroll their MacBook into Intune. Behind the scenes, a TAP is being created and distributed and delicately timed conditional access policies are being applied. Let’s implement the behind-the-scenes for the ‘Device onboarding workflow’.
lifetimeInMinutes
property to an hour, and the startDateTime
property to the time where you expect the employee to start the onboarding process at the office. Consider the following PowerShell snippet as an example, where we expect the new employee to perform Step 1 of the ‘Device onboarding workflow’ between 10 and 11 CET: $objIdEmp = “” # The object ID of your new employee goes in here
$uriTap = "https://graph.microsoft.com/v1.0/users/$($objIDEmp)/authentication/temporaryAccessPassMethods"
$tenOclockToday = $today.Date.AddHours(9) # 9 UTC (Function App environment) implies 10 CET
$tenOclockUtc = [System.TimeZoneInfo]::ConvertTime($tenOclockToday, $utcTimeZone)
$uri = https://graph.microsoft.com/v1.0/users/$($objIDEmp)/authentication/temporaryAccessPassMethods
$body = @{
isUsableOnce = $true
lifetimeInMinutes = 60 # Valid for 1 hour (window 10-11AM)
startDateTime = $tenOclockUtc
}
$tap = (Invoke-GraphRequest -uri $uriTap -method POST -body $body).temporaryAccessPass
Now that the TAP is ready for the new employee to use, let’s have a look at how to enable its usage.
$objIdEmp = “” # The object ID of your new employee goes in here
$APNewEmployeeAtOfficePolicyID = “” # Policy ID assigned to the "[H2 AP] New Employee at Office" access package
$APNewEmployeeAtOfficeID = “” # Object ID of the "[H2 AP] New Employee at Office" access package
$uriAssignmentRequest = "https://graph.microsoft.com/v1.0/identityGovernance/entitlementManagement/assignmentRequests"
$elevenOclockToday = $today.Date.AddHours(8) # 8 UTC (function app environment) implies 10 CET
$elevenOclockUtc = [System.TimeZoneInfo]::ConvertTime($elevenOclockToday, $utcTimeZone)
$body = @{ requestType = "adminAdd"
assignment = @{
targetId = $objIDEmp
assignmentPolicyId = $APNewEmployeeAtOfficePolicyID
accessPackageId = $APNewEmployeeAtOfficeID
}
schedule = @{
startDateTime = $elevenOclockUtc
}
}
Invoke-GraphRequest -uri $uriAssignmentRequest -method POST -body $body
As a final step, let’s implement an inverse of the New Employees conditional access policy to ensure that any employees who are in the H2 New Employee at Office security group but are not at the office, are not allowed to use any non-YubiKey authentication methods.
How will this newly created policy impact a new employee performing Step 1 of the ‘Device onboarding workflow’? Armed and enabled to use the TAP, the new employee should now be able to register their YubiKey and Microsoft Authenticator App without trouble. Step 2 is simple in terms of what happens behind-the-scenes, as it requires no special configuration. The user can simply enable password-less sign-ins on their mobile phone without any changes in the conditional access policy. Note that though the behind-the-scenes are simple here, authentication using YubiKey on mobile should still be thoroughly-tested across different mobile OSes and particularly when upgrades occur, lest you stumble into (now resolved) issues such as these... Step 3 also requires no further changes to the conditional access policy; the user can simply use their newly registered YubiKey to authenticate to the Company Portal app when enrolling their new MacBook to Intune. After onboarding day is over, the access package will have expired and the employee will adopt a ‘regular user’ persona, using only their YubiKey for password-less authentication.
The final lifecycle activity we need to take care of relates to users who block their YubiKey PINs or break, lose, or forget them at home. We designed the registration of the password-less Microsoft Authenticator App as part of user authentication method registration, to ensure that we have a solution for these users. With this secondary form of authentication, we can ensure users who are eligible can continue their work. We want to ensure the window where we allow users to authenticate with other forms of authentication (which are not phishing-resistant), is as narrow as possible. To achieve this, we utilized HR as our entry point for this process.
An employee who finds themselves in a situation where their YubiKey is unavailable, must contact HR and report the status of their YubiKey. HR performs identity verification and either approves this request or deems it ineligible (i.e. a user who has forgotten their YubiKey at home without good reason has to go back home and retrieve it). If the request is approved, HR initiates a request to IT, which in turn triggers a conditional access policy allowing the user to authenticate with password-less Microsoft Authenticator App. We defined the following restrictions for this:
Now that all lifecycle activities have been implemented, let’s discuss some recommendations on what to additionally configure to ensure we have not opened our security backdoor any wider than we need to.
We’ve now enforced YubiKey for all users, enabled secure self-registration for new hires, and provided clear paths for users whose keys are lost, broken, or PIN-blocked. Primary sign-ins are now passwordless. To avoid weakening controls, we tightly monitored Temporary Access Pass (TAP) issuance and applied Conditional Access with time- and location-based constraints whenever TAP or the passwordless Microsoft Authenticator app was used.
Before you begin, test registration and sign-in across all operating systems and key app surfaces in your tenant (ideally in a test tenant), and ship thorough user docs with screenshots.
Pro-tip: Measure success: track FIDO2 registration rates, break-glass account usage, TAP issuance, help-desk ticket volume, and time-to-recover for lost keys. Iterate policies as the org (and Microsoft’s features) evolve.
On the radar — Microsoft features that may simplify things further as they mature: