Login Delphi con Passkey, SAML SSO, LDAP e TOTP 2FA

· Componenti
Login Delphi con Passkey, SAML SSO, LDAP e TOTP 2FA

La schermata di login è l'unica parte di un'applicazione aziendale su cui ogni cliente ha un'opinione. Possiamo accedere con il nostro account Entra ID? Supporta le passkey? I nostri revisori vogliono l'autenticazione a due fattori. I nostri utenti sono in Active Directory, perché serve un'altra password? E la posta inviata dalla tua applicazione ha smesso di funzionare il giorno in cui Microsoft 365 ha rifiutato la password nelle impostazioni SMTP.

Ognuna di queste domande è un protocollo con una propria specifica, un proprio XML o ASN.1, e propri modi di essere quasi corretto. I nuovi componenti di autenticazione aziendale rispondono a queste domande come componenti Delphi. Sono inclusi nelle edizioni Enterprise e All-Access di sgcWebSockets e nel pacchetto sgcAuth, e gli stessi componenti fanno parte anche di sgcWebSockets .NET.

Passkey, come le vogliono gli utenti

Il server WebAuthn ora copre ciò che le persone intendono davvero quando parlano di passkey:

Single Sign-On SAML

I grandi clienti non vogliono che il loro personale abbia un account nella tua applicazione. Vogliono accedere con l'identity provider che l'azienda già utilizza. TsgcSAMLServiceProvider rende la tua applicazione un service provider SAML 2.0 per Entra ID, Okta, AD FS, Google Workspace e Keycloak. L'identity provider gestisce il login, la tua applicazione riceve un'asserzione, e la firma di quell'asserzione viene convalidata prima ancora che tu veda un nome utente.

Accesso ad Active Directory e LDAP

Per l'applicazione che gira all'interno della rete aziendale, gli utenti hanno già una password: quella di Windows. TsgcLDAPClient verifica un nome utente e una password contro Active Directory o qualsiasi directory LDAP, tramite LDAPS o StartTLS in modo che la password non attraversi mai la rete in chiaro. Imposta Security su ldapsecLDAPS o ldapsecStartTLS e chiama Authenticate.

Sapere chi è l'utente risponde solo a metà della domanda. GetUserGroups restituisce i gruppi a cui appartiene l'account, inclusi i gruppi annidati, così “questo utente è un approvatore di fatture” è una sola chiamata invece di una ricerca ricorsiva che devi scrivere e debuggare da solo.

Codici a due fattori da un'app di autenticazione

TsgcTOTPAuthenticator genera e verifica i codici a sei cifre di Google Authenticator, Microsoft Authenticator e qualsiasi altra app TOTP. La registrazione consiste in un segreto e un URI che mostri come codice QR. L'accesso è una sola chiamata:

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;

Quell'overload è la protezione dal replay: un codice già accettato viene rifiutato, anche entro i suoi trenta secondi, così un codice letto da qualcuno alle tue spalle non vale nulla una volta usato. Per il giorno in cui perdi il telefono, GenerateRecoveryCodes riempie una lista con codici di recupero monouso. Conservali come conservi le password.

Accesso con OpenID Connect

TsgcHTTP_OIDC_Client autentica gli utenti con qualsiasi provider OpenID Connect. Legge il documento di discovery del provider, così la configurazione è un URL dell'issuer e un client ID invece di un elenco di endpoint copiati a mano. Convalida l'ID token ricevuto, e le stesse chiavi di firma convalidano i bearer token che raggiungono la tua API REST, inclusi i token delle applicazioni multi-tenant di Entra ID, dove ogni tenant di cliente firma con il proprio issuer.

OAuth2 per la posta di Microsoft 365 e Gmail

Microsoft 365 e Gmail richiedono OAuth2, non una password, da SMTP, IMAP e POP3. TsgcMailOAuth2 ottiene il token di accesso, lo rinnova e costruisce la stringa XOAUTH2 con cui la tua sessione SMTP, IMAP o POP3 effettua l'accesso. Scegli il provider e i protocolli, fornisci il tuo client ID, e conserva il refresh token quando scatta OnTokensChanged. Un servizio o un'applicazione console senza browser può usare invece il flusso device code.

Prova le demo

Ogni componente ha una demo eseguibile in Demos\26.Authentication:

Documentazione

Dove trovarli

I componenti sono inclusi nelle edizioni Enterprise e All-Access di sgcWebSockets, per Delphi, C++ Builder e .NET. Se ti serve solo l'autenticazione, il pacchetto sgcAuth li offre da soli. Sono additivi: nulla cambia in un'applicazione esistente finché non ne trascini uno su un form.

Continua a leggere

Guardalo in video

C'è un breve video, “Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA”, sul canale eSeGeCe.

Domande, feedback o aiuto per integrarlo nella tua pagina di login? Contattaci. Riceverai una risposta dalle persone che hanno scritto il codice.