Nutzerüberprüfung im Detail

In diesem Dokument wird erläutert, was userVerification in WebAuthn ist und wie sich Browser verhalten, wenn userVerification beim Erstellen oder bei der Authentifizierung mit Passkeys angegeben wird.

Was ist die „Nutzerbestätigung“ in WebAuthn?

Passkeys basieren auf Public-Key-Kryptografie. Wenn Sie einen Passkey erstellen, wird ein Paar aus einem privaten und einem öffentlichen Schlüssel generiert. Der private Schlüssel wird vom Passkey-Anbieter gespeichert und der öffentliche Schlüssel wird an den Server der vertrauenden Partei (Relying Party, RP) zurückgegeben, um dort gespeichert zu werden. Der Server kann einen Nutzer authentifizieren, indem er eine Signatur, die mit demselben Passkey signiert wurde, mit dem gekoppelten öffentlichen Schlüssel überprüft. Das Flag „Nutzer anwesend“ (User Present, UP) für öffentliche Schlüsselanmeldedaten beweist, dass während der Authentifizierung jemand mit dem Gerät interagiert hat.

Die Nutzerbestätigung ist eine optionale Sicherheitsebene, mit der sichergestellt werden soll, dass die richtige Person bei der Authentifizierung anwesend war und nicht nur irgendeine Person, wie bei der Nutzeranwesenheit. Auf Smartphones erfolgt dies in der Regel über die Displaysperre, entweder biometrisch oder mit einer PIN oder einem Passwort. Ob die Nutzerüberprüfung durchgeführt wurde, wird im Flag „UV“ angegeben, das bei der Registrierung und Authentifizierung mit Passkeys in den Authentifikatordaten zurückgegeben wird.

Ein 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 die Authentifizierung anfordert, sowie der Nutzername angezeigt. Rechts oben im Dialogfeld befindet sich die Schaltfläche „Abbrechen“.
Dialogfeld zur Nutzerbestätigung im iCloud-Schlüsselbund unter macOS.
Ein Screenshot eines Dialogfelds zur Nutzerbestätigung in Chrome für Android. Im Dialogfeld wird der Nutzer aufgefordert, seine Identität per Gesichtserkennung oder Fingerabdruck zu bestätigen. Außerdem wird der Ursprung angezeigt, der die Authentifizierung anfordert. Unten links befindet sich eine Option zur Bestätigung mit einer PIN.
Dialogfeld zur Nutzerbestätigung in Android Chrome.

So werden UP und UV auf dem Server validiert

Die booleschen Flags für die Nutzeranwesenheit (User Presence, UP) und die Nutzerbestätigung (User Verified, UV) werden im Feld „Authenticator Data“ an den Server gesendet. Bei der Authentifizierung kann der Inhalt des Authentifikatordatenfelds validiert werden, indem die Signatur mit dem gespeicherten öffentlichen Schlüssel überprüft wird. Solange die Signatur gültig ist, kann der Server die Flags als echt betrachten.

Eine Darstellung der Datenstruktur für die Authentifizierung. Von links nach rechts lautet jeder Abschnitt der Datenstruktur „RP ID HASH“ (32 Bytes), „FLAGS“ (1 Byte), „COUNTER“ (4 Bytes, Big-Endian-uint32), „ATTESTE CRED. DATA“ (variable Länge, falls vorhanden) und „EXTENSIONS“ (variable Länge, falls vorhanden (CBOR)). Der Abschnitt „FLAGS“ wird maximiert und zeigt eine Liste potenzieller Flags, die von links nach rechts mit „ED“, „AT“, „0“, „BS“, „BE“, „UV“, „0“ und „UP“ beschriftet sind.
Authenticator-Datenfelder in einem Public-Key-Anmeldedaten.

Bei der Registrierung und Authentifizierung mit Passkeys sollte der Server prüfen, ob das UP-Flag je nach Anforderung true oder false und das UV-Flag true oder false ist.

userVerification-Parameter angeben

Gemäß der WebAuthn-Spezifikation kann der RP sowohl bei der Erstellung als auch bei der Assertion von Anmeldedaten eine Nutzerbestätigung mit einem userVerification-Parameter anfordern. Es akzeptiert 'preferred', 'required' oder 'discouraged', was Folgendes bedeutet:

  • 'preferred' (Standard): Die Verwendung einer Methode zur Nutzerbestätigung auf dem Gerät wird bevorzugt, kann aber übersprungen werden, wenn sie nicht verfügbar ist. Das Antwort-Anmeldedatenobjekt enthält den UV-Flag-Wert true, wenn die Nutzerbestätigung durchgeführt wurde, und false, wenn sie nicht durchgeführt wurde.
  • 'required': Es ist erforderlich, eine auf dem Gerät verfügbare Methode zur Nutzerbestätigung aufzurufen. Wenn keine verfügbar ist, schlägt die Anfrage lokal fehl. Das bedeutet, dass das Antwort-Anmeldedaten immer mit dem UV-Flag auf true zurückgegeben werden.
  • 'discouraged': Die Verwendung einer Methode zur Nutzerbestätigung wird nicht empfohlen. Je nach Gerät kann die Nutzerüberprüfung jedoch trotzdem durchgeführt werden und das UV-Flag kann true oder false enthalten.

Beispielcode für die Passkey-Erstellung:

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

Beispielcode für die Passkey-Authentifizierung:

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

Welche Option sollten Sie für userVerification auswählen?

Der userVerification-Wert, den Sie verwenden sollten, hängt von Ihren Anwendungsanforderungen und den Anforderungen an die Nutzerfreundlichkeit ab.

Verwendung von userVerification='preferred'

Verwenden Sie userVerification='preferred', wenn Sie die Nutzerfreundlichkeit wichtiger als den Schutz finden.

Es gibt Umgebungen, in denen die Nutzerbestätigung mehr Aufwand als Schutz bedeutet. Wenn Touch ID beispielsweise auf macOS nicht verfügbar ist (weil das Gerät sie nicht unterstützt, sie deaktiviert ist oder sich das Gerät im Clamshell-Modus befindet), wird der Nutzer stattdessen aufgefordert, sein Systempasswort einzugeben. Das führt zu Problemen und der Nutzer bricht die Authentifizierung möglicherweise ganz ab. Wenn es Ihnen wichtiger ist, Reibung zu vermeiden, verwenden Sie userVerification='preferred'.

Ein 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 die Authentifizierung anfordert, sowie den Nutzernamen. Rechts oben im Dialogfeld befindet sich die Schaltfläche „Abbrechen“.
Ein Passkey-Dialogfeld, das unter macOS angezeigt wird, wenn Touch ID nicht verfügbar ist.

Bei userVerification='preferred' ist das UV-Flag true, wenn die Nutzerbestätigung erfolgreich durchgeführt wurde, und false, wenn die Nutzerbestätigung übersprungen wurde. Auf macOS, wo Touch ID nicht verfügbar ist, wird der Nutzer beispielsweise aufgefordert, auf eine Schaltfläche zu klicken, um die Nutzerbestätigung zu überspringen. Die Anmeldedaten für den öffentlichen Schlüssel enthalten das UV-Flag false.

Die UV-Kennzeichnung kann dann ein Signal in Ihrer Risikoanalyse sein. Wenn der Anmeldeversuch aufgrund anderer Faktoren riskant erscheint, sollten Sie dem Nutzer möglicherweise zusätzliche Anmeldebestätigungen präsentieren, wenn die Nutzerbestätigung nicht durchgeführt wurde.

Verwendung von userVerification='required'

Verwenden Sie userVerification='required', wenn Sie der Meinung sind, dass sowohl UP als auch UV unbedingt erforderlich sind.

Ein Nachteil dieser Option ist, dass die Anmeldung für den Nutzer umständlicher sein kann. Wenn Touch ID beispielsweise auf macOS nicht verfügbar ist, wird der Nutzer aufgefordert, sein Systempasswort einzugeben.

Mit userVerification='required' können Sie dafür sorgen, dass die Nutzerüberprüfung auf dem Gerät erfolgt. Achten Sie darauf, dass der Server prüft, ob das UV-Flag true ist.

Fazit

Durch die Nutzerbestätigung können sich Passkey-RPs ein Bild davon machen, wie wahrscheinlich es ist, dass sich der Geräteinhaber anmeldet. Es liegt in ihrer Entscheidung, ob sie eine Nutzerbestätigung verlangen oder sie optional machen, je nachdem, wie kritisch sich der Fallback-Anmeldemechanismus auf den Nutzerfluss auswirkt. Achten Sie darauf, dass der Server das UP-Flag und das UV-Flag für die Passkey-Nutzerauthentifizierung prüft.