Implementierung von FIDO2 / YubiKey in Microsoft Entra ID ohne Mobile Authenticator und Umgang mit Self-Service-Password-Reset (SSPR)
Inhaltsverzeichnis
Hinweis: Dieser Artikel wurde automatisch übersetzt. Bei Unklarheiten oder Abweichungen gilt die englische Originalversion.
Übersicht #
FIDO2-Sicherheitsschlüssel ermöglichen eine sichere und bequeme passwortlose Authentifizierung. Für Organisationen, deren Mitarbeiter keine firmeneigenen Telefone besitzen oder keine persönlichen Geräte zur Authentifizierung nutzen möchten, stellt dieser Hardware-Token eine praktikable Alternative dar. Diese Anleitung zeigt die Implementierung von FIDO2/YubiKey als alleinige Authentifizierungsmethode in Microsoft Entra ID.
Diese Anleitung richtet sich an gemischte Umgebungen: Ein Teil der Benutzer nutzt nur FIDO2-Keys, andere nutzen weiterhin die Authenticator-App oder SMS und brauchen deshalb SSPR. Wer allen Benutzern vorab FIDO2-Keys ausgibt und per Conditional Access phishing-resistente MFA erzwingt, kann SSPR komplett abschalten – das ist der sicherere Zielzustand.
Wichtig: Ohne konfigurierte Ausnahme für das Self-Service-Passwort-Reset (SSPR) fordert das System Benutzer mit ausschließlicher FIDO2/Yubikey-Nutzung auf, den Microsoft Authenticator zu installieren.
Die Lösung hierfür befindet sich im Kapitel: Umgang mit SSPR
Implementierungsschritte #
FIDO2-Authentifizierung aktivieren
- Microsoft Entra Admin Center öffnen
- Zu Entra ID > Authentifizierungsmethoden > Richtlinien navigieren
Passkey (FIDO2)für die gewünschten Benutzer aktivieren und Self-Service-Einrichtung zulassen auf Ja setzen. Für reine Hardware-Keys ein Passkey-Profil mit gerätegebundenen Passkeys und erzwungener Attestierung verwenden
Temporären Zugangspass (TAP) konfigurieren
TAPin den Authentifizierungsmethoden-Einstellungen aktivieren- Gültigkeitsdauer festlegen (erlaubt: 10 Minuten bis 30 Tage, standardmäßig 1 bis 8 Stunden) und für die Erstregistrierung Einmalige Verwendung aktivieren
- TAP für die initiale FIDO2-Registrierung und Recovery-Szenarien nutzen
Benutzer-Registrierungsprozess
- Ein Administrator erstellt einen temporären Zugangspass (TAP) für den Benutzer
- Anmeldung unter mysignins.microsoft.com/security-info mit dem TAP
- Registrierung des FIDO2 Sicherheitsschlüssels
Sicherheitsvorteile #
- Phishing-resistente Authentifizierung
- Unabhängigkeit von mobilen Geräten
- Minimierung des passwortbezogenen IT-Supports
- Funktioniert für die Windows 10/11-Anmeldung auf Entra-joined Geräten (Hybrid Join: ab Windows 10 2004) und für Webanwendungen
Diese Konfiguration macht den Microsoft Authenticator überflüssig und gewährleistet gleichzeitig robuste Sicherheit durch hardwarebasierte Authentifizierung. Diese Benutzer sollten von der Registrierungskampagne ausgenommen werden, sonst fordert Entra sie weiterhin zur Einrichtung des Authenticators auf.
Umgang mit SSPR #
Passkeys zählen nicht als SSPR-Methode. Benutzer mit ausschließlich FIDO2-Keys erhalten bei Bedarf einen neuen TAP über den Helpdesk.
Da SSPR nur eine Einschluss-Gruppe unterstützt, muss eine Gruppe mit allen Benutzern erstellt werden - außer denen, die ausschließlich FIDO2-Schlüssel verwenden. Bei 100 Benutzern, von denen 2 ausgeschlossen werden sollen, enthält die Gruppe entsprechend 98 Benutzer. Verschachtelte Gruppen werden unterstützt. SSPR setzt Microsoft Entra ID P1 voraus.
Seit dem 30. September 2025 lassen sich die Authentifizierungsmethoden für MFA und SSPR nur noch in der Richtlinie für Authentifizierungsmethoden verwalten.

Folgende Optionen für die SSPR-Gruppenerstellung sind verfügbar:
Eine dynamische Gruppe erstellen, die alle Benutzer einschließt, außer diejenigen mit einem bestimmten Attribut.
Nachteil: Für mehr als nur eine Handvoll Benutzer ist dies sehr viel manueller Aufwand.Eine Azure Automation erstellen, die eine Gruppe mit Benutzern füllt, die SSPR nutzen dürfen:
- Alle Benutzer auswählen, ausgenommen jene, die ein FIDO2-Hardware-Token besitzen.
Nachteil: Neue Benutzer werden aufgefordert, einen Authenticator hinzuzufügen, bis das Skript ausgeführt wird. - Benutzer auswählen, die eine oder zwei SSPR-kompatible Authentifizierungsmethoden registriert haben.
Nachteil: Benutzer ohne registrierte Authentifizierungsmethode werden nicht aufgefordert, eine Methode zu registrieren.
- Alle Benutzer auswählen, ausgenommen jene, die ein FIDO2-Hardware-Token besitzen.
Alle diese Optionen erfordern eine Conditional-Access-Richtlinie, die alle Benutzer für die MFA-Registrierung einschließt, aus folgendem Grund:
Beispiel: alle Benutzer einschließen, als Gewährung „Authentifizierungsstärke erforderlich“ wählen und für Benutzer mit ausschließlich FIDO2-Keys „Phishing-resistente MFA“ verwenden.

Azure Automation #
Für diese Implementierung kommt Option 2.2 zum Einsatz:
Benutzer auswählen, die mindestens eine SSPR-kompatible Authentifizierungsmethode registriert haben.
Folgenden Code in der Automation verwenden (nicht empfohlen, aber das Skript kann auch manuell ausgeführt werden):
Anschließend die Gruppe $groupId als SSPR-fähige Gruppe hinzufügen.
Erforderliche Module:
- Microsoft.Graph.Authentication, Microsoft.Graph.Users, Microsoft.Graph.Identity.SignIns, Microsoft.Graph.Groups
Erforderliche Anwendungsberechtigungen (mit Administratorzustimmung): User.Read.All, UserAuthenticationMethod.Read.All, GroupMember.ReadWrite.All
Code: #
Der Code kann auch in unserem Repository gefunden werden: Samily-Scripts
## Variable Declartion Start ##
$clientId = "InsertClientID"
$tenantId = "InsertTenantID"
$thumbprint = "InsertThumbprint"
$groupId = "InsertGroupID" # Replace with the Object ID of your target group
# Insert Enabled Authentication Methods
$authMethodsToCheck = @("#microsoft.graph.microsoftAuthenticatorAuthenticationMethod",
"#microsoft.graph.phoneAuthenticationMethod",
"#microsoft.graph.emailAuthenticationMethod")
#Optional UPN Filter
#$UPNs = @("xyz.com",
# "abc.com")
## Variable Declartion End ##
Connect-MgGraph -ClientId $clientId -TenantId $tenantId -CertificateThumbprint $thumbprint -NoWelcome
# Get all users in Entra ID
$users = Get-MgUser -All -ConsistencyLevel eventual -Property Id,UserPrincipalName
$totalUsers = $users.Count # Total number of users for progress tracking
$currentUser = 0 # Counter for processed users
Write-Output "Getting Users"
# Initialize list for eligible users
$eligibleUsers = @()
Write-Output "Checking Users - Outputting Status in 50 User Increments"
# Iterate through each user and check their authentication methods
foreach ($user in $users) {
$currentUser++
if ($currentUser % 50 -eq 0) {
Write-Output "Checking user $currentUser/$totalUsers"
}
$eligible = $true
#Optional UPN Filter
# foreach ($UPN in $UPNs) {
# if ($user.UserPrincipalName -like "*$UPN") {
# $eligible = $false
# break
# }
# }
if ($eligible) {
try {
# Retrieve authentication methods for the user
$authMethods = Get-MgUserAuthenticationMethod -UserId $user.Id -ErrorAction SilentlyContinue
# Extract method types
$authMethodTypes = $authMethods | ForEach-Object { $_.AdditionalProperties["@odata.type"] }
# Check if user has at least one of the allowed authentication methods
$hasAllowedAuthMethod = $false
foreach ($method in $authMethodTypes) {
if ($authMethodsToCheck -contains $method) {
$hasAllowedAuthMethod = $true
break
}
}
# Add user to eligible list only if they have an allowed method
if ($hasAllowedAuthMethod) {
$eligibleUsers += $user.Id
}
} catch {
Write-Output "Error processing user $($user.UserPrincipalName): $_"
continue
}
}
}
Write-Output "`nFinished checking users."
# Add eligible users to the group, with progress updates
$totalEligibleUsers = $eligibleUsers.Count # Total number of eligible users
$currentEligibleUser = 0 # Counter for added eligible users
$newMembersAdded = 0
foreach ($userId in $eligibleUsers) {
$currentEligibleUser++
# Update progress on the same line for adding users to the group
Write-Host -NoNewline "`rAdding eligible user $currentEligibleUser/$totalEligibleUsers to the group"
try {
# Check if user is already a member of the group
$isMember = Get-MgGroupMember -GroupId $groupId -All | Where-Object { $_.Id -eq $userId }
if (-not $isMember) {
New-MgGroupMember -GroupId $groupId -DirectoryObjectId $userId
$newMembersAdded++
}
} catch {
Write-Output "Could not add $userId to Group."
continue
}
}
Write-Output "`n`n----------------------------------------`n`n"
Write-Output "Process finished - Checked $totalUsers users - $($eligibleUsers.Count) users were eligible - Added $newMembersAdded new members to group"