Connexion Delphi avec Passkeys, SSO SAML, LDAP et TOTP 2FA

· Composants
Connexion Delphi avec Passkeys, SSO SAML, LDAP et TOTP 2FA

L'écran de connexion est la seule partie d'une application métier sur laquelle chaque client a un avis. Pouvons-nous nous connecter avec notre compte Entra ID ? Prend-il en charge les passkeys ? Nos auditeurs veulent une double authentification. Nos utilisateurs sont dans Active Directory, pourquoi ont-ils besoin d'un autre mot de passe ? Et le courrier envoyé par votre application a cessé de fonctionner le jour où Microsoft 365 a refusé le mot de passe dans les paramètres SMTP.

Chacune de ces questions est un protocole avec sa propre spécification, son propre XML ou ASN.1, et ses propres façons de n'être presque juste. Les nouveaux composants d'authentification d'entreprise y répondent sous forme de composants Delphi. Ils sont inclus dans les éditions Enterprise et All-Access de sgcWebSockets et dans le pack sgcAuth, et les mêmes composants font aussi partie de sgcWebSockets .NET.

Passkeys, comme les utilisateurs les attendent

Le serveur WebAuthn couvre désormais ce que les gens veulent vraiment dire quand ils parlent de passkeys :

Authentification unique SAML

Les grands clients ne veulent pas que leur personnel ait un compte dans votre application. Ils veulent se connecter avec le fournisseur d'identité que l'entreprise utilise déjà. TsgcSAMLServiceProvider fait de votre application un fournisseur de services SAML 2.0 pour Entra ID, Okta, AD FS, Google Workspace et Keycloak. Le fournisseur d'identité gère la connexion, votre application reçoit une assertion, et la signature de cette assertion est validée avant même que vous voyiez un nom d'utilisateur.

Connexion à Active Directory et LDAP

Pour l'application qui s'exécute dans le réseau de l'entreprise, les utilisateurs ont déjà un mot de passe : celui de Windows. TsgcLDAPClient vérifie un nom d'utilisateur et un mot de passe par rapport à Active Directory ou à tout annuaire LDAP, via LDAPS ou StartTLS pour que le mot de passe ne traverse jamais le réseau en clair. Définissez Security sur ldapsecLDAPS ou ldapsecStartTLS et appelez Authenticate.

Savoir qui est l'utilisateur ne répond qu'à la moitié de la question. GetUserGroups renvoie les groupes auxquels appartient le compte, y compris les groupes imbriqués, de sorte que “cet utilisateur est-il un approbateur de factures” est un seul appel au lieu d'une recherche récursive que vous devez écrire et déboguer vous-même.

Codes à deux facteurs d'une application d'authentification

TsgcTOTPAuthenticator génère et vérifie les codes à six chiffres de Google Authenticator, Microsoft Authenticator et toute autre application TOTP. L'inscription consiste en un secret et une URI que vous affichez sous forme de code QR. La connexion est un seul appel :

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;

Cette surcharge est la protection contre le rejeu : un code déjà accepté est refusé, même dans ses propres trente secondes, de sorte qu'un code lu par-dessus l'épaule de quelqu'un ne vaut rien une fois utilisé. Pour le jour où le téléphone est perdu, GenerateRecoveryCodes remplit une liste de codes de récupération à usage unique. Conservez-les comme vous conservez les mots de passe.

Connexion avec OpenID Connect

TsgcHTTP_OIDC_Client connecte les utilisateurs avec n'importe quel fournisseur OpenID Connect. Il lit le document de découverte du fournisseur, de sorte que la configuration se résume à une URL d'émetteur et un ID client plutôt qu'à une liste de points de terminaison copiés à la main. Il valide le jeton d'ID qu'il reçoit, et les mêmes clés de signature valident les jetons porteurs qui atteignent votre propre API REST, y compris les jetons des applications multi-tenants Entra ID, où chaque tenant client signe avec son propre émetteur.

OAuth2 pour le courrier Microsoft 365 et Gmail

Microsoft 365 et Gmail attendent OAuth2, pas un mot de passe, pour SMTP, IMAP et POP3. TsgcMailOAuth2 obtient le jeton d'accès, le renouvelle, et construit la chaîne XOAUTH2 avec laquelle votre session SMTP, IMAP ou POP3 se connecte. Choisissez le fournisseur et les protocoles, indiquez votre ID client, et conservez le jeton d'actualisation lorsque OnTokensChanged se déclenche. Un service ou une application console sans navigateur peut utiliser à la place le flux de code d'appareil.

Essayez les démos

Chaque composant dispose d'une démo exécutable dans Demos\26.Authentication :

Documentation

Où les obtenir

Les composants sont inclus dans les éditions Enterprise et All-Access de sgcWebSockets, pour Delphi, C++ Builder et .NET. Si vous n'avez besoin que de l'authentification, le pack sgcAuth les propose seuls. Ils sont additifs : rien ne change dans une application existante tant que vous n'en déposez pas un sur un formulaire.

À lire aussi

Voir la vidéo

Il y a une courte vidéo, “Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA”, sur la chaîne eSeGeCe.

Des questions, des retours ou besoin d'aide pour l'intégrer à votre page de connexion ? Contactez-nous. Vous recevrez une réponse des personnes qui ont écrit le code.