Delphi SAML 单点登录
将您的 Delphi Web 应用接入企业身份提供者。用户通过 Microsoft Entra ID、Okta、AD FS、Google Workspace 或 Keycloak 一次登录,您的服务器随即收到经过签名且完整验证的身份信息。
将您的 Delphi Web 应用接入企业身份提供者。用户通过 Microsoft Entra ID、Okta、AD FS、Google Workspace 或 Keycloak 一次登录,您的服务器随即收到经过签名且完整验证的身份信息。
实现 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 中同样提供。
设置 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 元数据,并填充 IdPEntityID、IdPSSOURL、IdPSSOBinding 和 IdPCertificates。
GetAuthnRequestRedirectURL 返回带压缩后 AuthnRequest 的 HTTP-Redirect URL,GetAuthnRequestPostForm 返回自动提交的 HTTP-POST 表单。SignAuthnRequests 使用 SPCertificate 和 SPPrivateKey 对其签名。
签名只会对照 IdPCertificates 进行校验,消息中内嵌的证书从不被信任。支持 RSA-SHA256、RSA-SHA384 和 RSA-SHA512 及排他规范化,除非设置 AllowSHA1,否则 SHA-1 会被拒绝。
响应必须恰好包含一个作为直接子元素的断言,且签名必须引用该元素,从而挫败曾攻破多个 SAML 库的 XML 签名包装攻击。
ProcessResponse 会验证颁发者、受众、目的地、InResponseTo,以及基于 ClockSkew 和 MaxAssertionAge 的有效期窗口,并维护断言 ID 的防重放缓存。IdP 发起的登录在您设置 AllowIdPInitiated 之前始终保持关闭。
TsgcSAMLResult 返回 NameID、NameIDFormat、SessionIndex、AuthnInstant、带有友好名称的 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 单点登录 与三种最常见身份提供者的分步接入指南。 | 打开 |