SAML pour Delphi : authentification unique

Branche ton application web Delphi sur le fournisseur d'identité de l'entreprise. Les utilisateurs se connectent une seule fois avec Microsoft Entra ID, Okta, AD FS, Google Workspace ou Keycloak, et ton serveur reçoit une identité signée et entièrement validée.

TsgcSAMLServiceProvider

Implémente le côté fournisseur de services du profil SAML 2.0 Web Browser SSO : il construit l'AuthnRequest, publie les métadonnées SP et valide la réponse signée que le navigateur renvoie. Héberge les URLs dans n'importe quel serveur HTTP, tel que TsgcWebSocketHTTPServer ou TsgcHTTPServer.

Classe du composant

TsgcSAMLServiceProvider (unit sgcAuth_SAML_SP)

Protocole

SAML 2.0 (OASIS)

Plateformes

Windows, macOS, Linux, iOS, Android

Édition

Enterprise et All-Access, ainsi que le pack sgcAuth. Également disponible dans sgcWebSockets .NET.

Trois URLs et un appel de validation

Renseigne EntityID et AssertionConsumerServiceURL, charge les métadonnées de l'IdP, puis sers les métadonnées, la redirection de connexion et l'Assertion Consumer Service depuis ton gestionnaire HTTP.

uses
  sgcAuth_SAML_SP;

// SAML est un champ du formulaire : SAML: TsgcSAMLServiceProvider;
procedure TForm1.ConfigureSAML(const aIdPMetadataXML: string);
begin
  SAML := TsgcSAMLServiceProvider.Create(nil);
  SAML.EntityID := 'https://app.example.com/saml/metadata';
  SAML.AssertionConsumerServiceURL := 'https://app.example.com/saml/acs';
  // entity ID, URL SSO, binding et certificats de signature de l'IdP
  SAML.LoadIdPMetadata(aIdPMetadataXML);
end;

// GET /saml/metadata : retourne SAML.GetMetadata et enregistre-le dans l'IdP

// GET /saml/login : redirige le navigateur vers l'IdP
function TForm1.LoginURL(const aRelayState: string;
  out aRequestID: string): string;
begin
  // conserve aRequestID pour ce RelayState, l'ACS en a besoin
  Result := SAML.GetAuthnRequestRedirectURL(aRelayState, aRequestID);
end;

// POST /saml/acs : valide la réponse signée renvoyée par le navigateur
function TForm1.ValidateResponse(const aSAMLResponse, aRelayState,
  aRequestID: string): string;
var
  oResult: TsgcSAMLResult;
begin
  oResult := TsgcSAMLResult.Create;
  try
    if SAML.ProcessResponse(aSAMLResponse, aRelayState, aRequestID, oResult) then
      Result := oResult.NameID // plus oResult.Attributes et SessionIndex
    else
      raise Exception.Create(oResult.ErrorMessage);
  finally
    oResult.Free;
  end;
end;
// uses: sgcAuth_SAML_SP
TsgcSAMLServiceProvider *SAML = new TsgcSAMLServiceProvider(this);
SAML->EntityID = "https://app.example.com/saml/metadata";
SAML->AssertionConsumerServiceURL = "https://app.example.com/saml/acs";
SAML->LoadIdPMetadata(IdPMetadataXML);

// GET /saml/login
String RequestID;
String URL = SAML->GetAuthnRequestRedirectURL(RelayState, RequestID);

// POST /saml/acs
TsgcSAMLResult *SAMLResult = new TsgcSAMLResult();
if (SAML->ProcessResponse(SAMLResponse, RelayState, RequestID, SAMLResult))
  ShowMessage(SAMLResult->NameID);
delete SAMLResult;

Ce qu'il y a à l'intérieur

Un fournisseur de services simple à intégrer et strict sur ce qu'il accepte, parce qu'un bug SAML est un contournement de connexion.

Métadonnées dans les deux sens

GetMetadata produit les métadonnées SP à enregistrer chez le fournisseur d'identité. LoadIdPMetadata lit les métadonnées de l'IdP et renseigne IdPEntityID, IdPSSOURL, IdPSSOBinding et IdPCertificates.

Bindings Redirect et POST

GetAuthnRequestRedirectURL retourne l'URL HTTP-Redirect avec l'AuthnRequest compressé, GetAuthnRequestPostForm un formulaire HTTP-POST à soumission automatique. SignAuthnRequests les signe avec SPCertificate et SPPrivateKey.

Uniquement des clés de confiance

Les signatures ne sont vérifiées que face à IdPCertificates, un certificat intégré au message n'est jamais approuvé. RSA-SHA256, RSA-SHA384 et RSA-SHA512 avec canonicalisation exclusive. SHA-1 est rejeté sauf si AllowSHA1 est activé.

Protection contre le signature wrapping

La réponse doit contenir exactement une assertion en enfant direct, et la signature doit référencer cet élément, ce qui déjoue les attaques par signature XML wrapping qui ont compromis de nombreuses bibliothèques SAML.

Vérifications complètes de l'assertion

ProcessResponse valide l'issuer, l'audience, la destination, InResponseTo et la fenêtre de validité avec ClockSkew et MaxAssertionAge, et conserve un cache anti-rejeu des IDs d'assertion. La connexion initiée par l'IdP reste désactivée tant que tu ne définis pas AllowIdPInitiated.

Objet résultat clair

TsgcSAMLResult retourne NameID, NameIDFormat, SessionIndex, AuthnInstant, les Attributes avec leurs noms conviviaux, et un ErrorMessage lisible en cas de problème.

Spécifications et références

Sources faisant autorité pour les standards implémentés par ce composant.

Documentation et démos

Accès direct à la référence du composant, récupère le projet de démo prêt à l'emploi et télécharge l'essai.

Aide en ligne : TsgcSAMLServiceProvider Référence complète des propriétés, méthodes et événements de ce composant.
Projet de démo : Demos\26.Authentication\03.SAML_ServiceProvider Un fournisseur de services complet avec les URLs de connexion, d'ACS et de métadonnées sur un TsgcWebSocketHTTPServer. Livré dans le paquet sgcWebSockets, télécharge l'essai ci-dessous.
Document technique (PDF) Fonctionnalités, démarrage rapide, exemples de code pour Delphi et C++ Builder et références aux sources primaires pour ce composant uniquement.
Manuel utilisateur (PDF) Manuel complet couvrant tous les composants de la bibliothèque.
Blog : Authentification unique SAML en Delphi avec Entra ID, Okta et AD FS Configuration pas à pas avec les trois fournisseurs d'identité les plus courants.
Meilleur rapport qualité-prix : All-AccessTous les produits eSeGeCe, Support Premium inclus, à partir de €1,059/an.
Voir les tarifs All-Access

Prêt à ajouter l'authentification unique SAML ?

Télécharge l'essai gratuit et connecte ton application web Delphi au fournisseur d'identité que tes clients utilisent déjà.