Delphi-login met Passkeys, SAML SSO, LDAP en TOTP 2FA

· Componenten
Delphi-login met Passkeys, SAML SSO, LDAP en TOTP 2FA

Het inlogscherm is het ene onderdeel van een bedrijfsapplicatie waar elke klant een mening over heeft. Kunnen we inloggen met ons Entra ID-account? Ondersteunt het passkeys? Onze auditors willen twee factoren. Onze gebruikers staan in Active Directory, waarom hebben ze dan nog een wachtwoord nodig? En de mail die je applicatie verstuurt, werkte niet meer vanaf de dag dat Microsoft 365 het wachtwoord in de SMTP-instellingen weigerde.

Elk van die vragen is een protocol met zijn eigen specificatie, zijn eigen XML of ASN.1, en zijn eigen manieren om bijna goed te zijn. De nieuwe Enterprise-authenticatiecomponenten beantwoorden ze als Delphi-componenten. Ze zitten in de Enterprise- en All-Access-edities van sgcWebSockets en in het sgcAuth-pakket, en dezelfde componenten maken ook deel uit van sgcWebSockets .NET.

Passkeys, zoals gebruikers ze verwachten

De WebAuthn-server dekt nu wat mensen echt bedoelen als ze het over passkeys hebben:

SAML single sign-on

Grote klanten willen niet dat hun personeel een account in je applicatie heeft. Ze willen inloggen met de identity provider die het bedrijf al gebruikt. TsgcSAMLServiceProvider maakt van je applicatie een SAML 2.0-service provider voor Entra ID, Okta, AD FS, Google Workspace en Keycloak. De identity provider verzorgt het inloggen, je applicatie ontvangt een assertion, en de handtekening op die assertion wordt gevalideerd voordat je ooit een gebruikersnaam ziet.

Aanmelden bij Active Directory en LDAP

Voor de applicatie die binnen het bedrijfsnetwerk draait, hebben gebruikers al een wachtwoord: hun Windows-wachtwoord. TsgcLDAPClient controleert een gebruikersnaam en wachtwoord tegen Active Directory of elke LDAP-directory, via LDAPS of StartTLS zodat het wachtwoord nooit onversleuteld over het netwerk gaat. Zet Security op ldapsecLDAPS of ldapsecStartTLS en roep Authenticate aan.

Weten wie de gebruiker is, beantwoordt maar de helft van de vraag. GetUserGroups geeft de groepen terug waartoe het account behoort, inclusief geneste groepen, zodat “is deze gebruiker een factuurgoedkeurder” één aanroep is in plaats van een recursieve zoekopdracht die je zelf moet schrijven en debuggen.

Tweefactorcodes van een authenticator-app

TsgcTOTPAuthenticator genereert en controleert de zescijferige codes van Google Authenticator, Microsoft Authenticator en elke andere TOTP-app. Registratie is een secret en een URI die je als QR-code toont. Aanmelden is één aanroep:

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;

Die overload is de replay-bescherming: een code die al is geaccepteerd, wordt geweigerd, zelfs binnen zijn eigen dertig seconden, zodat een code die iemand over je schouder heeft gelezen niets meer waard is zodra hij is gebruikt. Voor de dag dat de telefoon kwijt is, vult GenerateRecoveryCodes een lijst met eenmalige herstelcodes. Bewaar ze zoals je wachtwoorden bewaart.

Aanmelden met OpenID Connect

TsgcHTTP_OIDC_Client meldt gebruikers aan bij elke OpenID Connect-provider. Het leest het discoverydocument van de provider, zodat de configuratie bestaat uit een issuer-URL en een client-ID in plaats van een handmatig gekopieerde lijst van endpoints. Het valideert het ontvangen ID-token, en dezelfde ondertekeningssleutels valideren de bearer tokens die je eigen REST-API bereiken, inclusief tokens van multi-tenant Entra ID-applicaties, waar elke klanttenant met zijn eigen issuer ondertekent.

OAuth2 voor Microsoft 365- en Gmail-mail

Microsoft 365 en Gmail verwachten OAuth2, geen wachtwoord, van SMTP, IMAP en POP3. TsgcMailOAuth2 haalt het access token op, vernieuwt het, en bouwt de XOAUTH2-string waarmee je SMTP-, IMAP- of POP3-sessie zich aanmeldt. Kies de provider en de protocollen, geef je client-ID op, en bewaar het refresh token wanneer OnTokensChanged afgaat. Een service of een consoletoepassing zonder browser kan in plaats daarvan de device code flow gebruiken.

Probeer de demo's

Elk component heeft een uitvoerbare demo in Demos\26.Authentication:

Documentatie

Waar je ze kunt krijgen

De componenten zitten in de Enterprise- en All-Access-edities van sgcWebSockets, voor Delphi, C++ Builder en .NET. Als je alleen authenticatie nodig hebt, biedt het sgcAuth-pakket ze los aan. Ze zijn additief: er verandert niets aan een bestaande applicatie totdat je er een op een formulier zet.

Lees verder

Bekijk het

Er is een korte video, “Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA”, op het eSeGeCe-kanaal.

Vragen, feedback of hulp bij het inbouwen in je inlogpagina? Neem contact op. Je krijgt antwoord van de mensen die de code hebben geschreven.