SAML w Delphi: jednokrotne logowanie

Podłącz swoją aplikację webową Delphi do firmowego dostawcy tożsamości. Użytkownicy logują się raz przez Microsoft Entra ID, Okta, AD FS, Google Workspace lub Keycloak, a Twój serwer otrzymuje podpisaną, w pełni zwalidowaną tożsamość.

TsgcSAMLServiceProvider

Implementuje stronę service providera profilu SAML 2.0 Web Browser SSO: buduje AuthnRequest, publikuje metadane SP i waliduje podpisaną odpowiedź, którą przeglądarka przesyła z powrotem. Udostępniaj adresy URL w dowolnym serwerze HTTP, takim jak TsgcWebSocketHTTPServer lub TsgcHTTPServer.

Klasa komponentu

TsgcSAMLServiceProvider (jednostka sgcAuth_SAML_SP)

Protokół

SAML 2.0 (OASIS)

Platformy

Windows, macOS, Linux, iOS, Android

Edycja

Enterprise i All-Access, a także pakiet sgcAuth. Dostępny również w sgcWebSockets .NET.

Trzy adresy URL i jedno wywołanie walidacji

Ustaw EntityID i AssertionConsumerServiceURL, wczytaj metadane IdP, a następnie obsłuż metadane, przekierowanie logowania i Assertion Consumer Service w swoim handlerze HTTP.

uses
  sgcAuth_SAML_SP;

// SAML to pole formularza: 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, adres URL SSO, binding i certyfikaty podpisujące IdP
  SAML.LoadIdPMetadata(aIdPMetadataXML);
end;

// GET /saml/metadata: zwróć SAML.GetMetadata i zarejestruj je u IdP

// GET /saml/login: przekieruj przeglądarkę do IdP
function TForm1.LoginURL(const aRelayState: string;
  out aRequestID: string): string;
begin
  // zachowaj aRequestID dla tego RelayState, ACS go potrzebuje
  Result := SAML.GetAuthnRequestRedirectURL(aRelayState, aRequestID);
end;

// POST /saml/acs: zwaliduj podpisaną odpowiedź przesłaną przez przeglądarkę
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 i 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;

Co jest w środku

Service provider łatwy w konfiguracji i rygorystyczny co do tego, co akceptuje, ponieważ błąd w SAML oznacza obejście logowania.

Metadane w obie strony

GetMetadata tworzy metadane SP do zarejestrowania u dostawcy tożsamości. LoadIdPMetadata odczytuje metadane IdP i wypełnia IdPEntityID, IdPSSOURL, IdPSSOBinding i IdPCertificates.

Bindingi Redirect i POST

GetAuthnRequestRedirectURL zwraca adres URL HTTP-Redirect ze skompresowanym AuthnRequest, GetAuthnRequestPostForm automatycznie wysyłany formularz HTTP-POST. SignAuthnRequests podpisuje je certyfikatem SPCertificate i kluczem SPPrivateKey.

Tylko zaufane klucze

Podpisy są sprawdzane wyłącznie względem IdPCertificates, certyfikat osadzony w wiadomości nigdy nie jest zaufany. RSA-SHA256, RSA-SHA384 i RSA-SHA512 z kanonikalizacją wyłączną. SHA-1 jest odrzucane, chyba że ustawiono AllowSHA1.

Ochrona przed signature wrapping

Odpowiedź musi zawierać dokładnie jedną asercję jako bezpośrednie dziecko, a podpis musi odnosić się do tego elementu, co eliminuje ataki XML signature wrapping, które złamały wiele bibliotek SAML.

Pełna walidacja asercji

ProcessResponse waliduje wydawcę, odbiorcę, miejsce docelowe, InResponseTo i okno ważności za pomocą ClockSkew i MaxAssertionAge, i utrzymuje cache ID asercji chroniący przed powtórzeniem. Logowanie inicjowane przez IdP pozostaje wyłączone, dopóki nie ustawisz AllowIdPInitiated.

Czysty obiekt wyniku

TsgcSAMLResult zwraca NameID, NameIDFormat, SessionIndex, AuthnInstant, Attributes z przyjaznymi nazwami oraz czytelny ErrorMessage, gdy coś jest nie tak.

Specyfikacje i odniesienia

Autorytatywne źródła dla standardów implementowanych przez ten komponent.

Dokumentacja i dema

Przejdź do dokumentacji komponentu, pobierz gotowy projekt demo i wersję próbną.

Pomoc online — TsgcSAMLServiceProvider Pełna dokumentacja właściwości, metod i zdarzeń tego komponentu.
Projekt demo — Demos\26.Authentication\03.SAML_ServiceProvider Kompletny service provider z adresami URL logowania, ACS i metadanych na TsgcWebSocketHTTPServer. Dołączony do pakietu sgcWebSockets — pobierz wersję próbną poniżej.
Dokument techniczny (PDF) Funkcje, szybki start, przykłady kodu dla Delphi i C++ Builder oraz odwołania do źródeł — tylko dla tego komponentu.
Podręcznik użytkownika (PDF) Kompleksowy podręcznik obejmujący każdy komponent biblioteki.
Blog: Jednokrotne logowanie SAML w Delphi z Entra ID, Okta i AD FS Konfiguracja krok po kroku z trzema najpopularniejszymi dostawcami tożsamości.
Najkorzystniejsza oferta: All-AccessWszystkie produkty eSeGeCe, ze wsparciem Premium w cenie, już od €1,059 rocznie.
Zobacz cennik All-Access

Gotowy na dodanie jednokrotnego logowania SAML?

Pobierz bezpłatną wersję próbną i podłącz swoją aplikację webową Delphi do dostawcy tożsamości, którego już używają Twoi klienci.