SAML em Delphi: Single Sign-On

Conecte sua aplicação web Delphi ao provedor de identidade corporativo. Os usuários fazem login uma vez com Microsoft Entra ID, Okta, AD FS, Google Workspace ou Keycloak, e seu servidor recebe uma identidade assinada e totalmente validada.

TsgcSAMLServiceProvider

Implementa o lado service provider do perfil SAML 2.0 Web Browser SSO: constrói o AuthnRequest, publica os metadados do SP e valida a resposta assinada que o navegador envia de volta. Hospede as URLs em qualquer servidor HTTP, como TsgcWebSocketHTTPServer ou TsgcHTTPServer.

Classe do componente

TsgcSAMLServiceProvider (unit sgcAuth_SAML_SP)

Protocolo

SAML 2.0 (OASIS)

Plataformas

Windows, macOS, Linux, iOS, Android

Edição

Enterprise e All-Access, além do pacote sgcAuth. Também disponível no sgcWebSockets .NET.

Três URLs e uma chamada de validação

Defina EntityID e AssertionConsumerServiceURL, carregue os metadados do IdP, e sirva os metadados, o redirecionamento de login e o Assertion Consumer Service a partir do seu handler HTTP.

uses
  sgcAuth_SAML_SP;

// SAML é um campo do formulário: 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 de SSO, binding e certificados de assinatura do IdP
  SAML.LoadIdPMetadata(aIdPMetadataXML);
end;

// GET /saml/metadata: retorna SAML.GetMetadata e registra no IdP

// GET /saml/login: redireciona o navegador para o IdP
function TForm1.LoginURL(const aRelayState: string;
  out aRequestID: string): string;
begin
  // guarde aRequestID para este RelayState, o ACS vai precisar
  Result := SAML.GetAuthnRequestRedirectURL(aRelayState, aRequestID);
end;

// POST /saml/acs: valida a resposta assinada enviada pelo navegador
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 // mais 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;

O que está incluído

Um service provider fácil de conectar e rigoroso quanto ao que aceita, porque um bug de SAML é um bypass de login.

Metadados nos dois sentidos

GetMetadata produz os metadados do SP para registrar no provedor de identidade. LoadIdPMetadata lê os metadados do IdP e preenche IdPEntityID, IdPSSOURL, IdPSSOBinding e IdPCertificates.

Bindings Redirect e POST

GetAuthnRequestRedirectURL retorna a URL HTTP-Redirect com o AuthnRequest comprimido, GetAuthnRequestPostForm um formulário HTTP-POST de envio automático. SignAuthnRequests os assina com SPCertificate e SPPrivateKey.

Somente chaves confiáveis

As assinaturas são conferidas apenas contra IdPCertificates, um certificado embutido na mensagem nunca é confiável. RSA-SHA256, RSA-SHA384 e RSA-SHA512 com canonicalização exclusiva. SHA-1 é rejeitado a menos que AllowSHA1 esteja definido.

Proteção contra signature wrapping

A resposta deve conter exatamente uma assertion como filho direto, e a assinatura deve referenciar esse elemento, o que derrota os ataques de XML signature wrapping que quebraram muitas bibliotecas SAML.

Verificações completas de assertion

ProcessResponse valida issuer, audience, destination, InResponseTo e a janela de validade com ClockSkew e MaxAssertionAge, e mantém um cache de repetição de IDs de assertion. O login iniciado pelo IdP fica desligado até você definir AllowIdPInitiated.

Objeto de resultado limpo

TsgcSAMLResult retorna NameID, NameIDFormat, SessionIndex, AuthnInstant, os Attributes com seus nomes amigáveis, e uma ErrorMessage legível quando algo dá errado.

Especificações & referências

Fontes oficiais dos padrões implementados por este componente.

Documentação & Demos

Acesse a referência do componente, obtenha o projeto de demo pronto para executar e baixe o trial.

Ajuda Online — TsgcSAMLServiceProvider Referência completa de propriedades, métodos e eventos deste componente.
Projeto de Demo — Demos\26.Authentication\03.SAML_ServiceProvider Um service provider completo com URLs de login, ACS e metadados em um TsgcWebSocketHTTPServer. Incluído no pacote sgcWebSockets — baixe o trial abaixo.
Documento Técnico (PDF) Recursos, quick start, exemplos de código para Delphi & C++ Builder e referências primárias — somente este componente.
Manual do Usuário (PDF) Manual abrangente cobrindo todos os componentes da biblioteca.
Blog: Single Sign-On SAML em Delphi com Entra ID, Okta e AD FS Configuração passo a passo com os três provedores de identidade mais comuns.
Melhor custo-benefício: All-AccessTodos os produtos da eSeGeCe, com Suporte Premium incluído, a partir de €1,059/ano.
Ver preços do All-Access

Pronto para Adicionar Single Sign-On SAML?

Baixe o trial gratuito e conecte sua aplicação web Delphi ao provedor de identidade que seus clientes já usam.