Delphi SAML シングルサインオン
Delphi の Web アプリケーションを企業のID プロバイダーに接続します。ユーザーは Microsoft Entra ID、Okta、AD FS、Google Workspace、Keycloak で一度サインインするだけで、サーバー側は署名済みで完全に検証されたIDを受け取ります。
Delphi の Web アプリケーションを企業のID プロバイダーに接続します。ユーザーは Microsoft Entra ID、Okta、AD FS、Google Workspace、Keycloak で一度サインインするだけで、サーバー側は署名済みで完全に検証されたIDを受け取ります。
SAML 2.0 Web Browser SSO プロファイルのサービスプロバイダー側を実装します。AuthnRequest を構築し、SPメタデータを公開し、ブラウザが返送する署名済みレスポンスを検証します。URLは TsgcWebSocketHTTPServer や TsgcHTTPServer など任意の HTTP サーバーでホストできます。
TsgcSAMLServiceProvider(ユニット sgcAuth_SAML_SP)
Windows, macOS, Linux, iOS, Android
Enterprise および All-Access、加えて sgcAuth パックでも利用できます。sgcWebSockets .NET でも利用可能です。
EntityID と AssertionConsumerServiceURL を設定し、IdPのメタデータを読み込んだうえで、メタデータ、ログインリダイレクト、Assertion Consumer Service を HTTP ハンドラーから提供します。
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 のエンティティ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 はIDプロバイダーに登録する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 は拒否されます。
レスポンスは直接の子要素として assertion を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 シングルサインオン 代表的な3つのIDプロバイダーごとの設定手順を順を追って解説します。 | 開く |