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.
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.
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-Flagtrue
, wenn die Nutzerüberprüfung durchgeführt wurde, undfalse
, 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-Flagtrue
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 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 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'
.
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.