Microsoft Entra IDとSimpleSAMLphpを利用したSAML認証SSO構築ガイド
作成日:2025.01.26
ローカル環境でMicrosoft Entra IDと連携したSAML認証のシングルサインオンを実現するための手順を紹介します。SimpleSAMLphpを利用した設定方法や、Microsoft側の構成変更について詳しく解説しています。
Microsoft Entra ID を IdP (Identity Provider) として利用した、 SAML認証による SSO(シングルサインオン) を、ローカル環境に設置した SimpleSAMLphp というPHPアプリケーションで実現する手順の解説です。
SimpleSAMLphp は、SAML認証のためのPHPアプリケーションで、 SP(Service Provider) としても、IdP としても動かすことができます。今回は、SimpleSAMLphp を SP として設定し、Microsoft Entra ID を IdP として利用します。
SimpleSAMLphp のダウンロードと展開
Downloads - SimpleSAMLphpから、SimpleSAMLphpのソースをダウンロードし、XAMPPのhtdocs内に展開します。
今回の例では、2025年1月25日現在の最新バージョン 2.3.5 を、 https://localhost/simplesamlphp/ に設置したと仮定して解説を進めます。
SimpleSAMLphp の導入と設定
SimpleSAMLphp を SP として利用するための設定を行ないます。
まずは、 config/config.php.dist をコピーして、 config/config.php を作成して、開きます。
baseurlpathを変更。
// 'baseurlpath' => 'simplesaml/',
'baseurlpath' => 'simplesamlphp/public/',
auth.adminpasswordを変更(デフォルトのままだとログインできません)。
// 'auth.adminpassword' => '123',
'auth.adminpassword' => 'hogehuga',
secretsaltを変更。
// 'secretsalt' => 'defaultsecretsalt',
'secretsalt' => '437shnynanpgxuzegzwuwck7buixrx7i',
続いて、 config/authsources.php.dist をコピーして config/authsources.php を作成して、開きます。
entityIDを変更。
// 'entityID' => 'https://myapp.example.org/',
'entityID' => 'https://localhost/simplesamlphp/public/module.php/saml/sp/metadata/default-sp',
SimpleSAMLphp の動作確認
これで最低限の設定はできたので、ブラウザで https://localhost/simplesamlphp/public/ にアクセスしてみます。
無事にWelcomeページが表示されればOkですが、私の環境では、Symfonyライブラリが足りなくて、以下のエラーが表示されました。
Caused by: Error: Interface "Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface" not found
ということで、コマンドプロンプトから Composer で足りないライブラリを追加していきます。
※Windows環境へのComposerのインストールに関しては、XAMPP環境にComposerをインストールする方法を参照。
まずは symfony/dependency-injection をインストール。
cd C:\xampp\htdocs\simplesamlphp
composer require symfony/dependency-injection --with-all-dependencies
※Composerでのライブラリインストールがタイムアウトする場合は、Composerのタイムアウト問題を解決する方法:設定変更でライブラリのダウンロードをスムーズにを参照。
インストールが終わって、改めてブラウザでアクセスしてみると、まだライブラリが足りないようで、以下のエラーが。
Caused by: Error: Class "Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AssetsContextPass" not found
ということで、続いて symfony/framework-bundle をインストール。
composer require symfony/framework-bundle
再度ブラウザでアクセスすると、引き続き別のエラー。
Caused by: Error: Class "Symfony\Component\HttpKernel\DependencyInjection\RegisterControllerArgumentLocatorsPass" not found
次は symfony/http-kernel をインストール。
composer require symfony/http-kernel
続いてのエラー。
Caused by: Error: Class "Symfony\Component\Routing\DependencyInjection\AddExpressionLanguageProvidersPass" not found
symfony/routing をインストール。
composer require symfony/routing
私の環境では、以上で足りないライブラリはインストール完了したようで、無事 https://localhost/simplesamlphp/public/ でウェルカムページが表示されました。
SimpleSAMLphp の管理画面にログイン
ブラウザで https://localhost/simplesamlphp/public/module.php/admin にアクセスすると、管理画面のログインフォームが表示されるので、先ほど config.php で設定した auth.adminpassword でログインします。
以下のような管理画面が表示されます。
一旦、SimpleSAMLphp の初期設定はこれで完了。続いて、Microsoft Entra ID 側の設定を行ないます。
Microsoft Entra ID 側での設定
Microsoft Entra 管理センターにログイン。
「アプリケーション」⇒「エンタープライズアプリケーション」を開き、「+新しいアプリケーション」をクリック。
「+独自のアプリケーションの作成」をクリックし、任意のアプリケーション名を入力(画像の例ではSimpleSAMLphp)。「ギャラリーに見つからないその他のアプリケーションを統合します (ギャラリー以外)」を選択して「作成」。
まずは、「ユーザーとグループの割り当て」から、SSOを許可したいユーザーを追加します。追加できるユーザーを増やしたい時は、一番左のサイドメニューの「ユーザー」から追加や招待が行なえます。
続いて「シングルサインオンの設定」へ進みます。
「SAML」を選択。
「1. 基本的な SAML 構成」の編集を行ないます。
以下の二項目を入力して「保存」。
- 識別子 (エンティティ ID)
- https://localhost/simplesamlphp/public/module.php/saml/sp/metadata/default-sp
- 応答 URL (Assertion Consumer Service URL)
- https://localhost/simplesamlphp/public/module.php/saml/sp/saml2-acs.php/default-sp
「3. SAML 証明書」の項目内の「フェデレーション メタデータ XML」をダウンロードしておきます。
SimpleSAMLphp にメタデータを登録
ここで再び、SimpleSAMLphp 側での作業に戻ります。
SimpleSAMLphp の管理画面から「連携」タブを開き、「XMLをSimpleSAMLphpメタデータに変換」へ進みます。
「or select a file:」の欄に、先ほど Microsoft Entra ID 側でダウンロードした「フェデレーション メタデータ XML」ファイルを指定し、「パース」を実行。
XMLメタデータが SimpleSAMLphp用に変換されるので、コピーしておきます。
metadata/saml20-idp-remote.php.dist をコピーして、metadata/saml20-idp-remote.php を作成し、開きます。
metadata/saml20-idp-remote.php の末尾に、先ほど変換したメタデータを貼り付けて保存。
<?php
/**
* SAML 2.0 remote IdP metadata for SimpleSAMLphp.
*
* Remember to remove the IdPs you don't use from this file.
*
* See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-remote
*/
$metadata['https://sts.windows.net/[entityid_of_microsoft_entra_id]/'] = [
'entityid' => 'https://sts.windows.net/[entityid_of_microsoft_entra_id]/',
'contacts' => [],
'metadata-set' => 'saml20-idp-remote',
'SingleSignOnService' => [
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://login.microsoftonline.com/[redirect_url_of_microsoft_entra_id]/saml2',
],
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://login.microsoftonline.com/[post_url_of_microsoft_entra_id]/saml2',
],
],
'SingleLogoutService' => [
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://login.microsoftonline.com/[loguot_url_of_microsoft_entra_id]/saml2',
],
],
'ArtifactResolutionService' => [],
'NameIDFormats' => [],
'keys' => [
[
'encryption' => false,
'signing' => true,
'type' => 'X509Certificate',
'X509Certificate' => '[ssl_certificate_key_string]',
],
],
];
これで設定は完了です。
SSOのテストを行なう
では、いよいよ Microsoft Entra ID と連携した SAML認証による SSO をテストしてみましょう。
SimpleSAMLphp の管理画面から「Test」タブを開き、「default-sp」に進みます。
Microsoft Entra ID の IdP が選択肢にあることを確認して「選択」。
マイクロソフトアカウントのログインページに飛び、ログインすると、SimpleSAMLphp に再びリダイレクトされ、以下のような画面が表示されれば、SSO成功です。
ついでに、SLO(シングルログアウト)も試してみましょう。上記画面の最下部に「ログアウト」ボタンがあるので、ここからログアウトを試してみて、マイクロソフトアカウントのログアウトページに飛び、ログアウトできれば成功です。
PHP 8.2対応で発生するCodeIgniter3の警告への対処方法
2025.01.30
PHP 8.2では動的プロパティの利用が非推奨となり、CodeIgniter3環境で警告が出る問題が発生します。本記事では、その警告を抑制するための一時的な方法を解説しています。
SAML通信の確認に便利なChrome拡張機能の紹介
2025.01.28
SAML認証を行なうWebアプリケーションの開発では、IdPとSP間でやり取りされるデータを確認したい場面が多々あります。本記事では、そうした作業に役立つChrome拡張機能「SAML Message Decoder」と「SAML Chrome Panel」を紹介します。
Composerのタイムアウト問題を解決する方法:設定変更でライブラリのダウンロードをスムーズに
2025.01.25
Composerでライブラリのインストール中に発生するタイムアウトエラーに対処する方法を解説します。タイムアウト設定の変更手順を紹介し、スムーズなダウンロードを実現するためのポイントを整理しました。
XAMPP環境でPHPを8.1から8.3にバージョンアップする手順と注意点
2025.01.22
XAMPP環境のPHPを8.3にアップデートする際の具体的な手順を解説します。また、curl関連のエラーとその解消方法についても触れています。