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 :
- Connexion sans nom d'utilisateur. L'utilisateur appuie sur un bouton, le navigateur propose les passkeys qu'il a enregistrés pour votre site, et le compte est identifié par l'identifiant. Rien à saisir.
- Saisie automatique. Les passkeys apparaissent dans la propre liste de suggestions du navigateur sur le champ du nom d'utilisateur, à côté des mots de passe enregistrés, de sorte qu'une page de connexion peut proposer les deux pendant que les utilisateurs font la transition.
- Plusieurs passkeys par utilisateur. Un sur le téléphone, un sur l'ordinateur portable, une clé matérielle dans un tiroir pour le jour où les deux sont perdus.
- Détection des passkeys synchronisés. Le serveur indique si un passkey est sauvegardé et synchronisé par la plateforme ou lié à un seul appareil, de sorte que votre politique peut les traiter différemment.
- Votre propre base de données. Les passkeys sont stockés à côté de votre table des utilisateurs, pas dans un fichier géré par le composant.
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 :
01.Passkeys, connexion sans nom d'utilisateur et saisie automatique dans le navigateur.02.TOTP, inscription avec un code QR, vérification et codes de récupération.03.SAML_ServiceProvider, authentification unique avec votre fournisseur d'identité.04.OpenID_Connect, connexion et validation des jetons.05.LDAP_ActiveDirectory, connexion et appartenance aux groupes.06.Mail_OAuth2, envoi de courrier depuis Microsoft 365 ou Gmail avec OAuth2.
Documentation
- Passkeys
- TsgcSAMLServiceProvider
- TsgcLDAPClient
- TsgcTOTPAuthenticator
- TsgcHTTP_OIDC_Client
- TsgcMailOAuth2
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.
