Delphi-Login mit Passkeys, SAML SSO, LDAP und TOTP 2FA

· Komponenten
Delphi-Login mit Passkeys, SAML SSO, LDAP und TOTP 2FA

Der Anmeldebildschirm ist der eine Teil einer Business-Anwendung, zu dem jeder Kunde eine Meinung hat. Können wir uns mit unserem Entra-ID-Konto anmelden? Unterstützt er Passkeys? Unsere Prüfer wollen Zwei-Faktor-Authentifizierung. Unsere Benutzer sind in Active Directory, warum brauchen sie noch ein Passwort? Und die Mail, die Ihre Anwendung verschickt, funktionierte nicht mehr, seit Microsoft 365 das Passwort in den SMTP-Einstellungen ablehnte.

Jede dieser Fragen ist ein Protokoll mit einer eigenen Spezifikation, einem eigenen XML oder ASN.1, und eigenen Wegen, fast richtig zu sein. Die neuen Enterprise-Authentifizierungskomponenten beantworten sie als Delphi-Komponenten. Sie sind Teil der Enterprise- und All-Access-Editionen von sgcWebSockets und des sgcAuth-Pakets, und dieselben Komponenten sind auch Teil von sgcWebSockets .NET.

Passkeys, wie Benutzer sie erwarten

Der WebAuthn-Server deckt jetzt ab, was Anwender wirklich meinen, wenn sie von Passkeys sprechen:

SAML-Single-Sign-On

Große Kunden wollen nicht, dass ihre Mitarbeiter ein Konto in Ihrer Anwendung haben. Sie wollen sich mit dem Identity-Provider anmelden, den das Unternehmen bereits betreibt. TsgcSAMLServiceProvider macht Ihre Anwendung zu einem SAML-2.0-Service-Provider für Entra ID, Okta, AD FS, Google Workspace und Keycloak. Der Identity-Provider übernimmt die Anmeldung, Ihre Anwendung erhält eine Assertion, und die Signatur dieser Assertion wird geprüft, bevor Sie überhaupt einen Benutzernamen sehen.

Anmeldung über Active Directory und LDAP

Für die Anwendung, die im Unternehmensnetzwerk läuft, haben die Benutzer bereits ein Passwort: ihr Windows-Passwort. TsgcLDAPClient prüft einen Benutzernamen und ein Passwort gegen Active Directory oder ein beliebiges LDAP-Verzeichnis, über LDAPS oder StartTLS, sodass das Passwort das Netzwerk nie im Klartext durchquert. Setzen Sie Security auf ldapsecLDAPS oder ldapsecStartTLS und rufen Sie Authenticate auf.

Zu wissen, wer der Benutzer ist, beantwortet nur die halbe Frage. GetUserGroups liefert die Gruppen, denen das Konto angehört, verschachtelte Gruppen eingeschlossen, sodass “ist dieser Benutzer ein Rechnungsfreigeber” ein einziger Aufruf ist statt einer rekursiven Suche, die Sie selbst schreiben und debuggen müssen.

Zwei-Faktor-Codes aus einer Authenticator-App

TsgcTOTPAuthenticator erzeugt und prüft die sechsstelligen Codes von Google Authenticator, Microsoft Authenticator und jeder anderen TOTP-App. Die Registrierung besteht aus einem Secret und einer URI, die Sie als QR-Code anzeigen. Die Anmeldung ist ein einziger Aufruf:

uses
  sgcAuth_TOTP, sgcBase_Helpers;

var
  oTOTP: TsgcTOTPAuthenticator;
  vSecret, vURI: string;
  vLastStep: Int64;
begin
  oTOTP := TsgcTOTPAuthenticator.Create(nil);
  try
    oTOTP.Issuer := 'MyApp';

    // enrolment: store vSecret with the user, show vURI as a QR code
    vSecret := oTOTP.GenerateSecret;
    vURI := oTOTP.GetProvisioningURI('john@example.com', vSecret);

    // sign-in: vLastStep is the last step accepted for this user, -1 the first time
    vLastStep := -1;
    if oTOTP.VerifyCode(vSecret, txtCode.Text,
      StrToInt64(GetDateTimeUnix(Now)), vLastStep) then
      ShowMessage('Signed in') // save vLastStep, this code is now spent
    else
      ShowMessage('Wrong, expired or already used');
  finally
    oTOTP.Free;
  end;
end;

Diese Überladung ist der Replay-Schutz: Ein Code, der bereits akzeptiert wurde, wird abgelehnt, selbst innerhalb seiner eigenen dreißig Sekunden, sodass ein Code, den jemand über die Schulter gelesen hat, nach der Verwendung wertlos ist. Für den Tag, an dem das Telefon verloren geht, füllt GenerateRecoveryCodes eine Liste mit einmaligen Wiederherstellungscodes. Bewahren Sie sie so auf wie Passwörter.

Anmeldung mit OpenID Connect

TsgcHTTP_OIDC_Client meldet Benutzer bei jedem beliebigen OpenID-Connect-Provider an. Er liest das Discovery-Dokument des Providers, sodass die Konfiguration aus einer Issuer-URL und einer Client-ID besteht statt aus einer von Hand kopierten Liste von Endpunkten. Er validiert das erhaltene ID-Token, und dieselben Signaturschlüssel validieren die Bearer-Token, die Ihre eigene REST-API erreichen, einschließlich Token von Multi-Tenant-Anwendungen in Entra ID, bei denen jeder Kunden-Tenant mit seinem eigenen Issuer signiert.

OAuth2 für Microsoft-365- und Gmail-Mail

Microsoft 365 und Gmail erwarten von SMTP, IMAP und POP3 OAuth2, kein Passwort. TsgcMailOAuth2 holt das Zugriffstoken, erneuert es und erstellt den XOAUTH2-String, mit dem sich Ihre SMTP-, IMAP- oder POP3-Sitzung anmeldet. Wählen Sie den Provider und die Protokolle, geben Sie Ihre Client-ID an, und speichern Sie das Refresh-Token, wenn OnTokensChanged ausgelöst wird. Ein Dienst oder eine Konsolenanwendung ohne Browser kann stattdessen den Device-Code-Flow verwenden.

Die Demos ausprobieren

Jede Komponente hat eine lauffähige Demo unter Demos\26.Authentication:

Dokumentation

Wo Sie sie bekommen

Die Komponenten sind in den Enterprise- und All-Access-Editionen von sgcWebSockets enthalten, für Delphi, C++ Builder und .NET. Wenn Sie nur Authentifizierung benötigen, bietet das sgcAuth-Paket sie einzeln an. Sie sind additiv: An einer bestehenden Anwendung ändert sich nichts, bis Sie eine davon auf ein Formular ziehen.

Weiterlesen

Video ansehen

Es gibt ein kurzes Video, “Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA”, auf dem eSeGeCe-Kanal.

Fragen, Feedback oder Hilfe bei der Einbindung in Ihre Anmeldeseite? Nehmen Sie Kontakt auf. Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.