In diesem Dokument wird erläutert, was userVerification
in WebAuthn ist und wie sich das Browserverhalten auswirkt, wenn userVerification
bei der Passkey-Erstellung oder Authentifizierung angegeben wird.
Was ist die Nutzerbestätigung in WebAuthn?
Passkeys basieren auf Public-Key-Kryptografie. Durch Erstellen eines Passkeys wird ein öffentlich-privates Schlüsselpaar generiert, der private Schlüssel wird vom Passkey-Anbieter gespeichert und der öffentliche Schlüssel wird zum Speichern an den Server der vertrauenden Partei zurückgegeben. Der Server kann einen Nutzer authentifizieren, indem er mithilfe des gekoppelten öffentlichen Schlüssels eine Signatur verifiziert, die vom selben Passkey signiert wurde. Das Flag „user vorhanden“ (UP) der Anmeldedaten für einen öffentlichen Schlüssel zeigt an, dass während der Authentifizierung jemand mit dem Gerät interagiert hat.
Die Nutzerbestätigung ist eine optionale Sicherheitsebene. Dabei wird geprüft, ob während der Authentifizierung die richtige Person und nicht nur eine bestimmte Person anwesend war. Auf Smartphones erfolgt dies normalerweise über die Displaysperre, unabhängig davon, ob es sich um ein biometrisches Verfahren, eine PIN oder ein Passwort handelt. Ob die Nutzerbestätigung durchgeführt wurde, wird in der UV-Markierung angezeigt, die bei der Passkey-Registrierung und -Authentifizierung in den Authenticator-Daten zurückgegeben wird
![Screenshot eines Dialogfelds zur Nutzerbestätigung im iCloud-Schlüsselbund unter macOS. Im Dialogfeld wird der Nutzer aufgefordert, sich mit Touch ID anzumelden. Dabei werden der Ursprung, der eine Authentifizierung anfordert, und der Nutzername angezeigt. Oben rechts im Dialogfeld befindet sich eine Schaltfläche mit der Bezeichnung „Abbrechen“.](https://web.dev/static/articles/webauthn-user-verification/image/fig-1.png?authuser=6&hl=de)
![Screenshot eines Dialogfelds zur Nutzerbestätigung in Chrome für Android. Im Dialogfeld wird der Nutzer aufgefordert, seine Identität mithilfe von Gesichtserkennung oder Fingerabdruckerkennung zu bestätigen. Außerdem wird der Ursprung angezeigt, der eine Authentifizierung anfordert. Links unten sehen Sie eine Option zur Bestätigung mit einer PIN.](https://web.dev/static/articles/webauthn-user-verification/image/fig-2.png?authuser=6&hl=de)
So werden UP und UV auf dem Server validiert
Die booleschen Flags „User Presence“ (UP) und „User Verification“ (UV) werden dem Server im Datenfeld des Authenticator angezeigt. Während der Authentifizierung kann der Inhalt des Datenfelds des Authenticator validiert werden, indem die Signatur mithilfe des gespeicherten öffentlichen Schlüssels verifiziert wird. Solange die Signatur gültig ist, kann der Server die Flags als echt einstufen.
![Darstellung der Authentifizierungsdatenstruktur. Von links nach rechts liest jeder Abschnitt der Datenstruktur „RP ID HASH“ (32 Byte), „FLAGS“ (1 Byte), „COUNTER“ (4 Byte, Big-Endian uint32) und „ATTESTE CRED“. DATA' (variable Länge, falls vorhanden) und 'EXTENSIONS' (variable Länge, falls vorhanden (CBOR)). Der Abschnitt "FLAGS" wird erweitert und zeigt eine Liste potenzieller Flags an, die von links nach rechts beschriftet sind: "ED", "AT", "0", "BS", "BE", "UV", "0" und "UP".](https://web.dev/static/articles/webauthn-user-verification/image/fig-3.png?authuser=6&hl=de)
Bei der Passkey-Registrierung und -Authentifizierung sollte der Server prüfen, ob das UP-Flag true
und das UV-Flag true
oder false
ist, je nach Anforderung.
Parameter userVerification
angeben
Gemäß der WebAuthn-Spezifikation kann das RP eine Nutzerbestätigung mit einem userVerification
-Parameter sowohl für die Erstellung als auch für die Assertion anfordern. Er akzeptiert 'preferred'
, 'required'
oder 'discouraged'
. Dies bedeutet:
'preferred'
(Standard): Es wird bevorzugt, eine Nutzerbestätigungsmethode auf dem Gerät zu verwenden. Wenn diese nicht verfügbar ist, kann sie aber übersprungen werden. Die Anmeldedaten der Antwort enthalten den UV-Flag-Werttrue
, wenn die Nutzerbestätigung durchgeführt wurde, undfalse
, wenn er nicht bestätigt wurde.'required'
: Es muss eine auf dem Gerät verfügbare Methode zur Nutzerbestätigung aufgerufen werden. Wenn keine verfügbar ist, schlägt die Anfrage lokal fehl. Das bedeutet, dass die Antwortanmeldedaten immer mit dem UV-Flag auftrue
zurückgegeben werden.'discouraged'
: Von einer Methode zur Nutzerbestätigung wird abgeraten. Je nach Gerät kann die Nutzerbestätigung aber trotzdem durchgeführt werden und das UV-Flag kanntrue
oderfalse
enthalten.
Beispielcode zum Erstellen eines Passkeys:
const publicKeyCredentialCreationOptions = {
// ...
authenticatorSelection: {
authenticatorAttachment: 'platform',
residentKey: 'required',
requireResidentKey: true,
userVerification: 'preferred'
}
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});
Beispielcode für Passkey-Authentifizierung:
const publicKeyCredentialRequestOptions = {
challenge: /* Omitted challenge data... */,
rpId: 'example.com',
userVerification: 'preferred'
};
const credential = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions
});
Welche Option solltest du für userVerification
auswählen?
Welchen userVerification
-Wert Sie verwenden sollten, hängt von Ihren Anwendungsanforderungen sowie Ihren Anforderungen an die Nutzerfreundlichkeit ab.
Verwendung von userVerification='preferred'
Verwende userVerification='preferred'
, wenn du der Nutzerfreundlichkeit Vorrang vor dem Schutz einräumst.
Es gibt Umgebungen, in denen die Nutzerbestätigung schwieriger ist als der Schutz. Auf macOS-Geräten, auf denen Touch ID nicht verfügbar ist, weil das Gerät diese Funktion nicht unterstützt, deaktiviert ist oder sich im Clamshell-Modus befindet, wird der Nutzer aufgefordert, stattdessen sein Systempasswort einzugeben. Das verursacht Probleme und der Nutzer bricht die Authentifizierung möglicherweise vollständig ab. Wenn es Ihnen wichtiger ist, Reibungspunkte zu vermeiden, verwenden Sie userVerification='preferred'
.
![Screenshot eines Passkey-Dialogfelds unter macOS, das angezeigt wird, wenn Touch ID nicht verfügbar ist. Das Dialogfeld enthält Informationen wie den Ursprung, der eine Authentifizierung anfordert, sowie den Nutzernamen. Oben rechts im Dialogfeld befindet sich eine Schaltfläche mit der Bezeichnung „Abbrechen“.](https://web.dev/static/articles/webauthn-user-verification/image/fig-4.png?authuser=6&hl=de)
Mit userVerification='preferred'
lautet das UV-Flag true
, wenn die Nutzerbestätigung erfolgreich durchgeführt wurde, und false
, wenn sie übersprungen wird. Auf macOS-Geräten, auf denen Touch ID nicht verfügbar ist, wird der Nutzer beispielsweise aufgefordert, auf eine Schaltfläche zu klicken, um die Nutzerbestätigung zu überspringen, und die Anmeldedaten mit öffentlichem Schlüssel enthalten das UV-Kennzeichen false
.
Die UV-Kennzeichnung kann dann ein Signal in Ihrer Risikoanalyse sein. Wenn der Anmeldeversuch aufgrund anderer Faktoren ein Risiko darstellt, können Sie ihm zusätzliche Identitätsbestätigungen anbieten, falls die Nutzerbestätigung nicht durchgeführt wurde.
Verwendung von userVerification='required'
Verwende userVerification='required'
, wenn du der Meinung bist, dass sowohl AF als auch UV-Strahlung absolut notwendig sind.
Ein Nachteil dieser Option ist, dass die Anmeldung für den Nutzer unter Umständen komplizierter ist. Auf macOS-Geräten, auf denen Touch ID nicht verfügbar ist, wird der Nutzer beispielsweise zur Eingabe seines Systempassworts aufgefordert.
Mit userVerification='required'
können Sie dafür sorgen, dass die Nutzerbestätigung auf dem Gerät durchgeführt wird. Der Server muss prüfen, ob das UV-Flag true
ist.
Fazit
Mithilfe der Nutzerbestätigung können Anbieter, die Passkeys verwenden, die Wahrscheinlichkeit messen, dass sich der Geräteeigentümer anmeldet. Sie kann selbst entscheiden, ob die Nutzerbestätigung erforderlich oder optional sein soll – je nachdem, wie wichtig der Fallback-Anmeldemechanismus die Aufrufabfolge von Webseiten hat. Achten Sie darauf, dass der Server die UP- und UV-Flags für die Passkey-Nutzerauthentifizierung prüft.