Nutzerüberprüfung im Detail

In diesem Dokument wird erläutert, was userVerification in WebAuthn ist und wie sich das Browserverhalten ändert, wenn userVerification beim Erstellen oder Authentifizieren eines Passkeys angegeben wird.

Was ist die „Nutzerbestätigung“ in WebAuthn?

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

Die Nutzerüberprüfung ist eine optionale Sicherheitsebene, mit der sichergestellt werden soll, dass bei der Authentifizierung die richtige Person anwesend war, nicht nur eine beliebige Person, wie bei der Nutzerpräsenz. Auf Smartphones geschieht dies in der Regel über den Displaysperremechanismus, sei es ein biometrisches Verfahren oder eine PIN oder ein Passwort. Ob die Nutzerüberprüfung durchgeführt wurde, wird im Flag „UV“ angegeben, das bei der Registrierung und Authentifizierung von Passkeys in den Authenticator-Daten 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. Außerdem werden die Quelle, die die Authentifizierung anfordert, und der Nutzername angezeigt. Rechts oben im Dialogfeld befindet sich die Schaltfläche „Abbrechen“.
Dialogfeld für die Nutzerbestätigung im iCloud-Schlüsselbund unter macOS.
Screenshot eines Dialogfelds zur Nutzerbestätigung in Chrome für Android Im Dialogfeld wird der Nutzer aufgefordert, seine Identität per Gesichtserkennung oder Fingerabdruckerkennung zu bestätigen. Außerdem wird die Quelle angezeigt, von der die Authentifizierung angefordert wird. Links unten können Sie die Bestätigung per PIN auswählen.
Dialogfeld zur Nutzerbestätigung in Chrome für Android.

So werden UP und UV auf dem Server validiert

Die booleschen Flags „User Presence“ (UP) und „User Verified“ (UV) werden dem Server im Datenfeld des Authenticators signalisiert. Während der Authentifizierung kann der Inhalt des Datenfelds des Authenticators durch Überprüfung der Signatur mit dem gespeicherten öffentlichen Schlüssel validiert werden. Solange die Signatur gültig ist, kann der Server die Flags als echt betrachten.

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

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

userVerification-Parameter angeben

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

  • 'preferred' (Standardeinstellung): Die Verwendung einer Nutzerbestätigungsmethode auf dem Gerät ist bevorzugt, kann aber übersprungen werden, wenn sie nicht verfügbar ist. Die Anmeldedaten in der Antwort enthalten das UV-Flag true, wenn die Nutzerüberprüfung durchgeführt wurde, und false, wenn die Nutzerüberprüfung nicht durchgeführt wurde.
  • 'required': Es ist erforderlich, eine auf dem Gerät verfügbare Nutzerbestätigungsmethode aufzurufen. Ist keine verfügbar, schlägt die Anfrage lokal fehl. Das bedeutet, dass die Anmeldedaten für die Antwort immer mit dem UV-Flag true zurückgegeben werden.
  • 'discouraged': Die Verwendung einer Nutzerbestätigungsmethode 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 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 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 Wert für userVerification, den Sie verwenden sollten, hängt von Ihren Anwendungsanforderungen und Ihren Anforderungen an die Nutzerfreundlichkeit ab.

Verwendung von userVerification='preferred'

Verwenden Sie userVerification='preferred', wenn Sie die Nutzerfreundlichkeit über den Schutz stellen.

Es gibt Umgebungen, in denen die Nutzerbestätigung mehr Aufwand als Schutz bedeutet. Wenn beispielsweise unter macOS Touch ID 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 kann die Authentifizierung ganz aufgeben. Wenn Sie die Abläufe möglichst reibungslos gestalten möchten, 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 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. Unter 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 Public-Key-Anmeldedaten enthalten dann das UV-Flag false.

Das UV-Flag kann dann ein Signal in Ihrer Risikoanalyse sein. Wenn der Anmeldeversuch aufgrund anderer Faktoren riskant erscheint, sollten Sie dem Nutzer zusätzliche Anmeldebestätigungen vorlegen, 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 Nutzer möglicherweise etwas umständlicher ist. Unter macOS, wo Touch ID nicht verfügbar ist, wird der Nutzer beispielsweise aufgefordert, sein Systempasswort einzugeben.

Mit userVerification='required' können Sie dafür sorgen, dass die Nutzerüberprüfung 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 Parteien, die Passkeys verwenden, die Wahrscheinlichkeit einschätzen, dass sich der Geräteinhaber anmeldet. Sie können festlegen, ob die Nutzerbestätigung erforderlich oder optional ist, je nachdem, wie wichtig der Fallback-Anmeldemechanismus für den Nutzerfluss ist. Der Server muss das UP- und UV-Flag für die Passkey-Nutzerauthentifizierung prüfen.