Delphi SAML シングルサインオン

Delphi の Web アプリケーションを企業のID プロバイダーに接続します。ユーザーは Microsoft Entra ID、Okta、AD FS、Google Workspace、Keycloak で一度サインインするだけで、サーバー側は署名済みで完全に検証されたIDを受け取ります。

TsgcSAMLServiceProvider

SAML 2.0 Web Browser SSO プロファイルのサービスプロバイダー側を実装します。AuthnRequest を構築し、SPメタデータを公開し、ブラウザが返送する署名済みレスポンスを検証します。URLは TsgcWebSocketHTTPServer や TsgcHTTPServer など任意の HTTP サーバーでホストできます。

コンポーネントクラス

TsgcSAMLServiceProvider(ユニット sgcAuth_SAML_SP

プロトコル

SAML 2.0 (OASIS)

対応プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

Enterprise および All-Access、加えて sgcAuth パックでも利用できます。sgcWebSockets .NET でも利用可能です。

3つのURLと1回の検証呼び出し

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のメタデータを読み込み、IdPEntityIDIdPSSOURLIdPSSOBindingIdPCertificates を設定します。

Redirect と POST バインディング

GetAuthnRequestRedirectURL は圧縮した AuthnRequest を含む HTTP-Redirect URL を返し、GetAuthnRequestPostForm は自動送信される HTTP-POST フォームを返します。SignAuthnRequestsSPCertificateSPPrivateKey で署名します。

信頼された鍵のみ使用

署名は IdPCertificates に対してのみ検証され、メッセージに埋め込まれた証明書が信頼されることはありません。RSA-SHA256、RSA-SHA384、RSA-SHA512 と排他的正規化に対応し、AllowSHA1 を設定しない限り SHA-1 は拒否されます。

署名ラッピング攻撃への対策

レスポンスは直接の子要素として assertion を1つだけ持つ必要があり、署名はその要素を参照している必要があります。これにより、多くの SAML ライブラリを脅かしてきた XML 署名ラッピング攻撃を防ぎます。

アサーションの全項目検証

ProcessResponse は発行者、対象者、宛先、InResponseToClockSkewMaxAssertionAge による有効期間を検証し、アサーションIDのリプレイキャッシュを保持します。IdP起点のサインインは AllowIdPInitiated を設定するまで無効のままです。

整理された結果オブジェクト

TsgcSAMLResultNameIDNameIDFormatSessionIndexAuthnInstant、フレンドリー名付きの 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プロバイダーごとの設定手順を順を追って解説します。
最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

SAML シングルサインオンを追加しませんか?

体験版をダウンロードして、Delphi の Web アプリケーションを顧客がすでに使っているIDプロバイダーに接続してください。