SAML Delphi: Single Sign-On

Collega la tua applicazione web Delphi all'identity provider aziendale. Gli utenti accedono una sola volta con Microsoft Entra ID, Okta, AD FS, Google Workspace o Keycloak, e il tuo server riceve un'identità firmata e completamente convalidata.

TsgcSAMLServiceProvider

Implementa il lato service provider del profilo SAML 2.0 Web Browser SSO: costruisce l'AuthnRequest, pubblica i metadata dell'SP e convalida la risposta firmata che il browser rinvia. Ospita gli URL in qualsiasi server HTTP, come TsgcWebSocketHTTPServer o TsgcHTTPServer.

Classe del componente

TsgcSAMLServiceProvider (unit sgcAuth_SAML_SP)

Protocollo

SAML 2.0 (OASIS)

Piattaforme

Windows, macOS, Linux, iOS, Android

Edizione

Enterprise

Tre URL e una chiamata di validazione

Imposta EntityID e AssertionConsumerServiceURL, carica i metadata dell'IdP, poi servi i metadata, il redirect di login e l'Assertion Consumer Service dal tuo HTTP handler.

uses
  sgcAuth_SAML_SP;

// SAML è un campo del form: 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 e certificati di firma dell'IdP
  SAML.LoadIdPMetadata(aIdPMetadataXML);
end;

// GET /saml/metadata: restituisci SAML.GetMetadata e registralo nell'IdP

// GET /saml/login: reindirizza il browser all'IdP
function TForm1.LoginURL(const aRelayState: string;
  out aRequestID: string): string;
begin
  // conserva aRequestID per questo RelayState, serve all'ACS
  Result := SAML.GetAuthnRequestRedirectURL(aRelayState, aRequestID);
end;

// POST /saml/acs: convalida la risposta firmata inviata dal browser
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 // più oResult.Attributes e 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;

Cosa contiene

Un service provider facile da collegare e rigoroso su ciò che accetta, perché un bug in SAML significa un bypass del login.

Metadata in entrambe le direzioni

GetMetadata produce i metadata dell'SP da registrare nell'identity provider. LoadIdPMetadata legge i metadata dell'IdP e popola IdPEntityID, IdPSSOURL, IdPSSOBinding e IdPCertificates.

Binding Redirect e POST

GetAuthnRequestRedirectURL restituisce l'URL HTTP-Redirect con l'AuthnRequest compresso, GetAuthnRequestPostForm un form HTTP-POST a invio automatico. SignAuthnRequests li firma con SPCertificate e SPPrivateKey.

Solo chiavi fidate

Le firme sono verificate solo rispetto a IdPCertificates, un certificato incorporato nel messaggio non è mai considerato fidato. RSA-SHA256, RSA-SHA384 e RSA-SHA512 con canonicalizzazione esclusiva. SHA-1 viene rifiutato a meno che non sia impostato AllowSHA1.

Protezione dal signature wrapping

La risposta deve contenere esattamente un'assertion come figlio diretto, e la firma deve fare riferimento a quell'elemento, il che neutralizza gli attacchi di XML signature wrapping che hanno compromesso molte librerie SAML.

Controlli completi sull'assertion

ProcessResponse convalida issuer, audience, destination, InResponseTo e la finestra di validità con ClockSkew e MaxAssertionAge, e mantiene una cache anti-replay degli assertion ID. L'accesso avviato dall'IdP resta disattivato finché non imposti AllowIdPInitiated.

Un result object pulito

TsgcSAMLResult restituisce NameID, NameIDFormat, SessionIndex, AuthnInstant, gli Attributes con i loro nomi descrittivi, e un ErrorMessage leggibile quando qualcosa va storto.

Specifiche e riferimenti

Fonti autorevoli per gli standard implementati da questo componente.

Documentazione e demo

Vai al riferimento del componente, scarica il progetto demo pronto all'uso e prova la versione trial.

Guida online: TsgcSAMLServiceProvider Riferimento completo di proprietà, metodi ed eventi per questo componente.
Progetto demo: Demos\26.Authentication\03.SAML_ServiceProvider Un service provider completo con URL di login, ACS e metadata su un TsgcWebSocketHTTPServer. Incluso nel pacchetto sgcWebSockets, scarica la versione di prova qui sotto.
Documento tecnico (PDF) Funzionalità, guida rapida, esempi di codice per Delphi e C++ Builder e riferimenti alle fonti primarie, solo per questo componente.
Manuale utente (PDF) Manuale completo che copre tutti i componenti della libreria.
Blog: Single Sign-On SAML in Delphi con Entra ID, Okta e AD FS Configurazione passo passo con i tre identity provider più diffusi.
La scelta più conveniente: All-AccessTutti i prodotti eSeGeCe, con Supporto Premium incluso, a partire da €1,059/anno.
Vedi i prezzi All-Access

Pronto ad aggiungere il Single Sign-On SAML?

Scarica la versione di prova gratuita e collega la tua applicazione web Delphi all'identity provider che i tuoi clienti già utilizzano.