ログイン画面は、業務アプリケーションの中で顧客全員が意見を持つ唯一の部分です。Entra ID アカウントでサインインできますか。パスキーに対応していますか。監査部門は二要素認証を求めています。ユーザーはすでに Active Directory にいるのに、なぜもう一つパスワードが必要なのですか。そして、アプリケーションが送信するメールは、Microsoft 365 が SMTP 設定のパスワードを拒否した日から動かなくなりました。
これらの問いはそれぞれ独自の仕様、独自の XML や ASN.1、そして「ほぼ正しい」ための独自の流儀を持つプロトコルです。新しいエンタープライズ認証コンポーネントは、これらに Delphi コンポーネントとして応えます。sgcWebSockets の Enterprise エディションと All-Access エディション、および sgcAuth パックに含まれており、同じコンポーネントは sgcWebSockets .NET の一部でもあります。
ユーザーが期待する形のパスキー
WebAuthn サーバーは、人々がパスキーと言うときに実際に意味する内容を、いまやカバーしています。
- ユーザー名不要のサインイン。ユーザーはボタンを一つ押すだけで、ブラウザがそのサイト用に保存しているパスキーを提示し、アカウントは認証情報によって特定されます。入力するものは何もありません。
- 自動入力。パスキーは、保存されたパスワードと並んで、ユーザー名フィールドのブラウザ自体の候補リストに表示されるため、ログインページはユーザーが移行する間、両方を提供できます。
- ユーザーごとに複数のパスキー。スマートフォンに一つ、ノートパソコンに一つ、そして両方を失くした日のために引き出しの中にハードウェアキーを一つ。
- 同期パスキーの検出。サーバーは、プラットフォームがバックアップして同期しているパスキーと、単一のデバイスに紐付いたパスキーを区別するため、ポリシー側で両者を異なる扱いにできます。
- 自前のデータベース。パスキーはコンポーネントが管理するファイルではなく、ユーザーテーブルの隣に保存されます。
SAML シングルサインオン
大企業の顧客は、自社のスタッフが御社のアプリケーションにアカウントを持つことを望みません。会社がすでに運用している ID プロバイダーでサインインさせたいのです。TsgcSAMLServiceProvider は、御社のアプリケーションを Entra ID、Okta、AD FS、Google Workspace、Keycloak 向けの SAML 2.0 サービスプロバイダーにします。ID プロバイダーがログインを処理し、御社のアプリケーションはアサーションを受け取りますが、そのアサーションの署名は、ユーザー名を目にする前に検証されます。
Active Directory と LDAP ログイン
社内ネットワーク内で動作するアプリケーションの場合、ユーザーはすでにパスワード、つまり Windows のパスワードを持っています。TsgcLDAPClient は、LDAPS または StartTLS を介して Active Directory や任意の LDAP ディレクトリに対してユーザー名とパスワードを検証するため、パスワードが平文でネットワークを通過することはありません。Security を ldapsecLDAPS または ldapsecStartTLS に設定し、Authenticate を呼び出します。
ユーザーが誰であるかを知ることは、質問の半分にしか答えていません。GetUserGroups はネストされたグループを含め、そのアカウントが属するグループを返すため、“このユーザーは請求書の承認者か”という問いは、自分で書いてデバッグする再帰検索ではなく、一回の呼び出しで済みます。
認証アプリによる二要素認証コード
TsgcTOTPAuthenticator は、Google Authenticator、Microsoft Authenticator、その他あらゆる TOTP アプリの 6 桁コードを生成し、検証します。登録は、シークレットと QR コードとして表示する URI から成ります。サインインは一回の呼び出しです。
uses
sgcAuth_TOTP, sgcBase_Helpers;
var
oTOTP: TsgcTOTPAuthenticator;
vSecret, vURI: string;
vLastStep: Int64;
begin
oTOTP := TsgcTOTPAuthenticator.Create(nil);
try
oTOTP.Issuer := 'MyApp';
// enrolment: store vSecret with the user, show vURI as a QR code
vSecret := oTOTP.GenerateSecret;
vURI := oTOTP.GetProvisioningURI('john@example.com', vSecret);
// sign-in: vLastStep is the last step accepted for this user, -1 the first time
vLastStep := -1;
if oTOTP.VerifyCode(vSecret, txtCode.Text,
StrToInt64(GetDateTimeUnix(Now)), vLastStep) then
ShowMessage('Signed in') // save vLastStep, this code is now spent
else
ShowMessage('Wrong, expired or already used');
finally
oTOTP.Free;
end;
end;
このオーバーロードがリプレイ保護です。すでに受け入れられたコードは、自身の 30 秒以内であっても拒否されるため、誰かに肩越しに読まれたコードも、使われた後は無価値になります。電話を失くした日のために、GenerateRecoveryCodes は使い捨ての復旧コードのリストを生成します。パスワードと同じように保管してください。
OpenID Connect によるサインイン
TsgcHTTP_OIDC_Client は、任意の OpenID Connect プロバイダーでユーザーをサインインさせます。プロバイダーのディスカバリードキュメントを読み込むため、設定は手作業でコピーしたエンドポイントの一覧ではなく、発行者の URL とクライアント ID だけで済みます。受け取った ID トークンを検証し、同じ署名鍵で、御社自身の REST API に届くベアラートークンも検証します。これには、各顧客テナントが自身の発行者で署名する Entra ID のマルチテナントアプリケーションのトークンも含まれます。
Microsoft 365 と Gmail のメール向け OAuth2
Microsoft 365 と Gmail は、SMTP、IMAP、POP3 に対してパスワードではなく OAuth2 を要求します。TsgcMailOAuth2 はアクセストークンを取得し、更新し、SMTP、IMAP、POP3 セッションがサインインに使う XOAUTH2 文字列を組み立てます。プロバイダーとプロトコルを選び、クライアント ID を指定し、OnTokensChanged が発生したらリフレッシュトークンを保存してください。ブラウザのないサービスやコンソールアプリケーションは、代わりにデバイスコードフローを使用できます。
デモを試す
すべてのコンポーネントには、Demos\26.Authentication に実行可能なデモがあります。
01.Passkeys、ブラウザでのユーザー名不要のサインインと自動入力。02.TOTP、QR コードによる登録、検証、復旧コード。03.SAML_ServiceProvider、ID プロバイダーとのシングルサインオン。04.OpenID_Connect、サインインとトークン検証。05.LDAP_ActiveDirectory、ログインとグループメンバーシップ。06.Mail_OAuth2、OAuth2 を使った Microsoft 365 または Gmail からのメール送信。
ドキュメント
- Passkeys
- TsgcSAMLServiceProvider
- TsgcLDAPClient
- TsgcTOTPAuthenticator
- TsgcHTTP_OIDC_Client
- TsgcMailOAuth2
入手方法
これらのコンポーネントは、Delphi、C++ Builder、.NET 向け sgcWebSockets の Enterprise エディションと All-Access エディションに含まれています。認証機能だけが必要な場合は、sgcAuth パックで単体でも提供されています。これらは追加的なものです。フォームに一つ配置するまで、既存のアプリケーションで何も変わりません。
次に読む
動画で見る
“Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA” というタイトルの短い動画が eSeGeCe チャンネルにあります。
ご質問、フィードバック、またはログインページへの組み込みのサポートが必要ですか? お問い合わせください。コードを書いた本人から返信が届きます。
