Inicio de Sesión Único SAML para Delphi

Conecta tu aplicación web Delphi al proveedor de identidad corporativo. Los usuarios inician sesión una sola vez con Microsoft Entra ID, Okta, AD FS, Google Workspace o Keycloak, y tu servidor recibe una identidad firmada y totalmente validada.

TsgcSAMLServiceProvider

Implementa el lado del proveedor de servicios del perfil SAML 2.0 Web Browser SSO: construye el AuthnRequest, publica los metadatos del SP y valida la respuesta firmada que el navegador envía de vuelta. Aloje las URL en cualquier servidor HTTP, como TsgcWebSocketHTTPServer o TsgcHTTPServer.

Clase del componente

TsgcSAMLServiceProvider (unidad sgcAuth_SAML_SP)

Protocolo

SAML 2.0 (OASIS)

Plataformas

Windows, macOS, Linux, iOS, Android

Edición

Enterprise

Tres URL y una llamada de validación

Configura EntityID y AssertionConsumerServiceURL, carga los metadatos del IdP y luego sirve los metadatos, la redirección de login y el Assertion Consumer Service desde tu manejador HTTP.

uses
  sgcAuth_SAML_SP;

// SAML is a form field: 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 and signing certificates of the IdP
  SAML.LoadIdPMetadata(aIdPMetadataXML);
end;

// GET /saml/metadata: return SAML.GetMetadata and register it in the IdP

// GET /saml/login: redirect the browser to the IdP
function TForm1.LoginURL(const aRelayState: string;
  out aRequestID: string): string;
begin
  // keep aRequestID for this RelayState, the ACS needs it
  Result := SAML.GetAuthnRequestRedirectURL(aRelayState, aRequestID);
end;

// POST /saml/acs: validate the signed response posted by the 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 // plus oResult.Attributes and 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;

Qué incluye

Un proveedor de servicios fácil de configurar y estricto con lo que acepta, porque un fallo en SAML es una forma de saltarse el login.

Metadatos en ambos sentidos

GetMetadata genera los metadatos del SP para registrarlos en el proveedor de identidad. LoadIdPMetadata lee los metadatos del IdP y rellena IdPEntityID, IdPSSOURL, IdPSSOBinding e IdPCertificates.

Bindings Redirect y POST

GetAuthnRequestRedirectURL devuelve la URL HTTP-Redirect con el AuthnRequest comprimido; GetAuthnRequestPostForm devuelve un formulario HTTP-POST de autoenvío. SignAuthnRequests los firma con SPCertificate y SPPrivateKey.

Solo claves de confianza

Las firmas se comprueban solo contra IdPCertificates; un certificado incluido en el mensaje nunca es de confianza. RSA-SHA256, RSA-SHA384 y RSA-SHA512 con canonicalización exclusiva. SHA-1 se rechaza salvo que se active AllowSHA1.

Protección contra signature wrapping

La respuesta debe contener exactamente una assertion como hijo directo, y la firma debe referenciar ese elemento, lo que neutraliza los ataques de XML signature wrapping que comprometieron muchas bibliotecas SAML.

Comprobaciones completas de la assertion

ProcessResponse valida el issuer, la audience, el destination, InResponseTo y la ventana de validez con ClockSkew y MaxAssertionAge, y mantiene una caché de reproducción de los ID de assertion. El inicio de sesión iniciado por el IdP permanece desactivado hasta que actives AllowIdPInitiated.

Objeto de resultado limpio

TsgcSAMLResult devuelve NameID, NameIDFormat, SessionIndex, AuthnInstant, los Attributes con sus nombres descriptivos, y un ErrorMessage legible cuando algo falla.

Especificaciones y referencias

Fuentes autorizadas de los estándares que implementa este componente.

Documentación y Demos

Enlace directo a la referencia del componente, descarga el proyecto demo listo para ejecutar y la prueba gratuita.

Online Help — TsgcSAMLServiceProvider Referencia completa de propiedades, métodos y eventos de este componente.
Demo Project — Demos\26.Authentication\03.SAML_ServiceProvider Proyecto de ejemplo listo para ejecutar. Se incluye en el paquete sgcWebSockets, descarga la prueba gratuita más abajo.
Documento técnico (PDF) Características, inicio rápido, ejemplos de código para Delphi y C++ Builder y referencias de fuentes primarias, solo este componente.
Manual de usuario (PDF) Manual completo que cubre todos los componentes de la biblioteca.
Blog: Inicio de sesión único SAML en Delphi con Entra ID, Okta y AD FS Configuración paso a paso con los tres proveedores de identidad más habituales.
La mejor opción: All-AccessTodos los productos de eSeGeCe, con Premium Support incluido, desde €1,059 al año.
Ver precios de All-Access

¿Listo para añadir inicio de sesión único SAML?

Descarga la prueba gratuita y conecta tu aplicación web Delphi al proveedor de identidad que ya usan tus clientes.