Delphi SAML 单点登录

将您的 Delphi Web 应用接入企业身份提供者。用户通过 Microsoft Entra ID、Okta、AD FS、Google Workspace 或 Keycloak 一次登录,您的服务器随即收到经过签名且完整验证的身份信息。

TsgcSAMLServiceProvider

实现 SAML 2.0 Web 浏览器 SSO 配置文件中的服务提供者一端:构建 AuthnRequest、发布 SP 元数据,并验证浏览器回传的已签名响应。URL 可托管在任意 HTTP 服务器上,例如 TsgcWebSocketHTTPServer 或 TsgcHTTPServer。

组件类

TsgcSAMLServiceProvider(单元 sgcAuth_SAML_SP

平台

Windows, macOS, Linux, iOS, Android

版本

Enterprise 和 All-Access,以及 sgcAuth 软件包。sgcWebSockets .NET 中同样提供。

三个 URL,一次验证调用

设置 EntityID 和 AssertionConsumerServiceURL,加载 IdP 元数据,然后在您的 HTTP 处理程序中提供元数据、登录重定向和 Assertion Consumer Service。

uses
  sgcAuth_SAML_SP;

// SAML 是窗体字段: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';
  // IdP 的 entity ID、SSO URL、绑定方式与签名证书
  SAML.LoadIdPMetadata(aIdPMetadataXML);
end;

// GET /saml/metadata:返回 SAML.GetMetadata 并在 IdP 中注册

// GET /saml/login:将浏览器重定向到 IdP
function TForm1.LoginURL(const aRelayState: string;
  out aRequestID: string): string;
begin
  // 为此 RelayState 保留 aRequestID,ACS 需要用到它
  Result := SAML.GetAuthnRequestRedirectURL(aRelayState, aRequestID);
end;

// POST /saml/acs:验证浏览器回传的已签名响应
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 // 另外还有 oResult.Attributes 与 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;

内部功能

一个易于接入且验证严格的服务提供者,因为 SAML 中的漏洞就意味着登录被绕过。

双向元数据

GetMetadata 生成需在身份提供者中注册的 SP 元数据。LoadIdPMetadata 读取 IdP 元数据,并填充 IdPEntityIDIdPSSOURLIdPSSOBindingIdPCertificates

Redirect 与 POST 绑定

GetAuthnRequestRedirectURL 返回带压缩后 AuthnRequest 的 HTTP-Redirect URL,GetAuthnRequestPostForm 返回自动提交的 HTTP-POST 表单。SignAuthnRequests 使用 SPCertificateSPPrivateKey 对其签名。

仅信任受信证书

签名只会对照 IdPCertificates 进行校验,消息中内嵌的证书从不被信任。支持 RSA-SHA256、RSA-SHA384 和 RSA-SHA512 及排他规范化,除非设置 AllowSHA1,否则 SHA-1 会被拒绝。

签名包装攻击防护

响应必须恰好包含一个作为直接子元素的断言,且签名必须引用该元素,从而挫败曾攻破多个 SAML 库的 XML 签名包装攻击。

完整的断言校验

ProcessResponse 会验证颁发者、受众、目的地、InResponseTo,以及基于 ClockSkewMaxAssertionAge 的有效期窗口,并维护断言 ID 的防重放缓存。IdP 发起的登录在您设置 AllowIdPInitiated 之前始终保持关闭。

清晰的结果对象

TsgcSAMLResult 返回 NameIDNameIDFormatSessionIndexAuthnInstant、带有友好名称的 Attributes,以及出错时可读的 ErrorMessage

规范与参考

本组件所实现标准的权威来源。

文档与演示

直达组件参考,获取可立即运行的演示项目,并下载试用版。

在线帮助:TsgcSAMLServiceProvider 本组件的完整属性、方法和事件参考。
演示项目:Demos\26.Authentication\03.SAML_ServiceProvider 在 TsgcWebSocketHTTPServer 上实现登录、ACS 和元数据 URL 的完整服务提供者。随 sgcWebSockets 包一起提供,请从下方下载试用版。
技术文档 (PDF) 仅涵盖本组件的功能、快速入门、Delphi 和 C++ Builder 代码示例及主要参考来源。
用户手册 (PDF) 涵盖库中每个组件的综合手册。
博客:使用 Entra ID、Okta 和 AD FS 在 Delphi 中实现 SAML 单点登录 与三种最常见身份提供者的分步接入指南。
超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

准备好添加 SAML 单点登录了吗?

下载免费试用版,将您的 Delphi Web 应用接入客户已在使用的身份提供者。