Delphi SAML-single sign-on

Koppel je Delphi-webtoepassing aan de identity provider van je organisatie. Gebruikers melden zich één keer aan met Microsoft Entra ID, Okta, AD FS, Google Workspace of Keycloak, en je server ontvangt een ondertekende, volledig gevalideerde identiteit.

TsgcSAMLServiceProvider

Implementeert de service-provider-kant van het SAML 2.0 Web Browser SSO-profiel: het bouwt de AuthnRequest, publiceert de SP-metadata en valideert de ondertekende response die de browser terugstuurt. Host de URL's op elke HTTP-server, zoals TsgcWebSocketHTTPServer of TsgcHTTPServer.

Component-class

TsgcSAMLServiceProvider (unit sgcAuth_SAML_SP)

Protocol

SAML 2.0 (OASIS)

Platforms

Windows, macOS, Linux, iOS, Android

Editie

Enterprise en All-Access, plus het sgcAuth-pakket. Ook beschikbaar in sgcWebSockets .NET.

Drie URL's en één validatieaanroep

Stel EntityID en AssertionConsumerServiceURL in, laad de IdP-metadata, en serveer vervolgens de metadata, de login-redirect en de Assertion Consumer Service vanuit je HTTP-handler.

uses
  sgcAuth_SAML_SP;

// SAML is een form-veld: 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, SSO-URL, binding en ondertekeningscertificaten van de IdP
  SAML.LoadIdPMetadata(aIdPMetadataXML);
end;

// GET /saml/metadata: geef SAML.GetMetadata terug en registreer het bij de IdP

// GET /saml/login: redirect de browser naar de IdP
function TForm1.LoginURL(const aRelayState: string;
  out aRequestID: string): string;
begin
  // bewaar aRequestID voor deze RelayState, de ACS heeft het nodig
  Result := SAML.GetAuthnRequestRedirectURL(aRelayState, aRequestID);
end;

// POST /saml/acs: valideer de ondertekende response die de browser post
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 en 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;

Wat zit erin

Een service provider die eenvoudig aan te sluiten is en streng is over wat hij accepteert, want een SAML-bug is een omzeiling van het login.

Metadata in beide richtingen

GetMetadata produceert de SP-metadata om te registreren bij de identity provider. LoadIdPMetadata leest de IdP-metadata en vult IdPEntityID, IdPSSOURL, IdPSSOBinding en IdPCertificates.

Redirect- en POST-bindings

GetAuthnRequestRedirectURL geeft de HTTP-Redirect-URL terug met de gecomprimeerde AuthnRequest, GetAuthnRequestPostForm een automatisch verzonden HTTP-POST-formulier. SignAuthnRequests ondertekent ze met SPCertificate en SPPrivateKey.

Alleen vertrouwde sleutels

Handtekeningen worden alleen gecontroleerd tegen IdPCertificates; een certificaat dat in het bericht is ingesloten wordt nooit vertrouwd. RSA-SHA256, RSA-SHA384 en RSA-SHA512 met exclusieve canonicalisatie. SHA-1 wordt geweigerd tenzij AllowSHA1 is ingesteld.

Bescherming tegen signature wrapping

De response moet exact één assertion als direct kindelement bevatten, en de handtekening moet naar dat element verwijzen, wat de XML-signature-wrapping-aanvallen verijdelt die veel SAML-bibliotheken hebben gebroken.

Volledige assertion-controles

ProcessResponse valideert issuer, audience, destination, InResponseTo en het geldigheidsvenster met ClockSkew en MaxAssertionAge, en houdt een replaycache van assertion-ID's bij. Door de IdP geïnitieerde login blijft uit totdat je AllowIdPInitiated instelt.

Overzichtelijk resultaatobject

TsgcSAMLResult geeft NameID, NameIDFormat, SessionIndex, AuthnInstant, de Attributes met hun vriendelijke namen, en een leesbare ErrorMessage als er iets misgaat.

Specificaties en referenties

Gezaghebbende bronnen voor de standaarden die dit component implementeert.

Documentatie en demo's

Diepe link naar de componentreferentie, pak het kant-en-klare demoproject en download de proefversie.

Online help — TsgcSAMLServiceProvider Volledige property-, methode- en event-referentie voor dit component.
Demoproject — Demos\26.Authentication\03.SAML_ServiceProvider Een complete service provider met login-, ACS- en metadata-URL's op een TsgcWebSocketHTTPServer. Zit in het sgcWebSockets-pakket — download hieronder de proefversie.
Technisch document (PDF) Functies, snelstart, codevoorbeelden voor Delphi en C++ Builder en primaire bronreferenties — alleen dit component.
Gebruikershandleiding (PDF) Uitgebreide handleiding die elk component in de bibliotheek behandelt.
Blog — SAML-single sign-on in Delphi met Entra ID, Okta en AD FS Stap-voor-stap opzet met de drie meest gebruikte identity providers.
De beste deal: All-AccessElk eSeGeCe-product, inclusief Premium-ondersteuning, vanaf €1,059 per jaar.
Bekijk de All-Access-prijzen

Klaar om SAML-single sign-on toe te voegen?

Download de gratis proefversie en koppel je Delphi-webtoepassing aan de identity provider die je klanten al gebruiken.