TsgcWSAPIServer_WebAuthn › Ereignisse › OnWebAuthnAuthenticationGetCredential
Wird bei der Prüfung einer Assertion ausgelöst, wenn das vom Browser verwendete Credential nicht in der Credential-Liste der Zeremonie enthalten ist (Anmeldung ohne Benutzernamen und Passkey-Autofill); die Anwendung gibt den Credential-Datensatz aus ihrem eigenen Speicher zurück.
property OnWebAuthnAuthenticationGetCredential: TsgcWebAuthnOnAuthenticationGetCredential;
// TsgcWebAuthnOnAuthenticationGetCredential = procedure(Sender: TObject; const aCredentialId: String; const aCredentialRecord: TsgcWebAuthn_CredentialRecord; var Found: Boolean) of object
Nicht zugewiesen.
Wenn der Browser eine Authentifizierungszeremonie beantwortet, sucht der Server das Credential in den Credential-Datensätzen der Zeremonie, den von OnWebAuthnAuthenticationOptionsRequest zurückgegebenen oder in der internen Liste gefundenen. Bei einer Anmeldung ohne Benutzernamen oder mit Passkey-Autofill ist diese Liste üblicherweise leer, sodass der Server dieses Ereignis mit der vom Browser gesendeten Credential-ID auslöst (aCredentialId, base64url).
Suchen Sie das Credential in Ihrem Speicher, füllen Sie aCredentialRecord (zum Beispiel mit ReadJSON und dem aus AsJSON in OnWebAuthnRegistrationSuccessful gespeicherten JSON) und setzen Sie Found auf true. Der Datensatz muss sein UserId (User Handle) behalten, das mit dem userHandle der Antwort verglichen wird. Die Anmeldung schlägt fehl, wenn Found false ist, wenn das CredentialId des Datensatzes nicht aCredentialId ist, oder wenn die Zeremonie mit einem Benutzernamen gestartet wurde und der Username des Datensatzes abweicht. Nach diesem Ereignis wird die Assertion wie üblich mit dem öffentlichen Schlüssel des Datensatzes verifiziert.
Das vollständige Speichermuster finden Sie unter Passkeys.
procedure TForm1.sgcWSAPIServer_WebAuthn1WebAuthnAuthenticationGetCredential(
Sender: TObject; const aCredentialId: String;
const aCredentialRecord: TsgcWebAuthn_CredentialRecord; var Found: Boolean);
var
vJSON: string;
begin
Found := DBFindPasskey(aCredentialId, vJSON);
if Found then
aCredentialRecord.ReadJSON(vJSON);
end;