1つのサーバ内でSimpleSAMLphpのIdPとSPを構築して、ひとりSSO遊びをする

## Index
* [前提](#前提)
* [SimpleSAMLphpのダウンロードと解凍](#simplesamlphpのダウンロードと解凍)
* [Apacheの設定](#apacheの設定)
* [<font color="#660033"><b>IdP</b></font>構築手順](#idp構築手順)
* [<font color="#007c99"><b>SP</b></font>構築手順](#sp構築手順)
* [SSO連携手順](#sso連携手順)
* [おまけ：SAML連携時の通信の中身を見てみる](#おまけsaml連携時の通信の中身を見てみる)

## 前提

* すでにLAMP環境もしくはXAMPP環境を構築済みであること。ここではXAMPPを使ってますが、当然LAMP環境でも動きます。

  * [LAMPの構築手順](https://qiita.com/yamori4/items/f554a2bc6ea400d0e808)
  * [XAMPPの構築手順](https://github.com/yamori4/objectOriented/blob/master/_readMe/installXampp.md)

* XAMPPのApacheのDocumentRootは"C:/xampp/htdocs"としています。大抵のLinux環境(CentOS系)だと　"/var/www/html/" に相当するパスです。(Debian系だとまた違うパスだったりしますが。)

* 実用に耐えるSSO環境を構築するのを目的とはしておらず、その前段階で、<font color="red">ローカルで気楽に色々触れる環境の構築を目的としています。 なのでセキュリティ的にはザルです。</font>

* ここではウェブサーバのドメインを「localhost」として動かしてます。

## SimpleSAMLphpのダウンロードと解凍

* まずは、[ここ](https://simplesamlphp.org/download)からSimpleSamlPHPをダウンロードしてきます。下の画像では最新バージョンをダウンロードしてきます。別バーションを使用する場合はこの手順書のバージョンに関する記載を各自置き換えて読んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/fbd9ce31-9cf1-7a0a-5baf-55c20258a09e.png)

* ダウンロードしたファイルの拡張子は".tar.gz"ですから、windowsだと対応している解凍アプリ(7-zipとかPeaZipとか)を使ってファイルを解凍します。Linuxなら「$ tar -zxvf simplesamlphp-1.19.0-rc1.tar.gz」コマンドで解凍すればいいです。

* Apacheの制御下にあるディレレクトリに解凍したフォルダを配置します。

```
C:\xampp\htdocs (←Apacheの制御下のフォルダ、環境の設定によって変わる)
　　　　　　└ simplesamlphp-1.19.0-rc1
```


* simplesamlphp-1.19.0-rc1フォルダを複製して、１つは<font color="#660033"><b>IdP</b></font>用(ファイル名を「<font color="#660033"><b>ssoIdp</b></font>」)に、もう１つは<font color="#007c99"><b>SP</b></font>用に(ファイル名を「<font color="#007c99"><b>ssoSp</b></font>」)に名前を変更します。

```
C:\xampp\htdocs
　　　　　　├ ssoIdp
　　　　　　└ ssoSp
```
## Apacheの設定
* Apacheの設定ファイルに、「<font color="#660033"><b>ssoIdp</b></font>\\www\\」と「<font color="#007c99"><b>ssoSp</b></font>\\www\\」配下以外にはアクセスできないようにする設定と、エイリアスの設定を追加します。

Apacheのhttpd.confファイルを開いて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/c533abcc-07eb-9577-d0ae-2c3cc3c0733f.png)

&lt;Directory "C:/xampp/htdocs"&gt;の下あたりにでも以下のように設定を追加します。
(Windows環境だとリクエストURLの大文字と小文字の区別がされるため、リクエストURLによってはC:\\xampp\\htdocs\\<font color="#660033"><b>ssoIdp</b></font>\\またはC:\\xampp\\htdocs\\<font color="#007c99"><b>ssoSp</b></font>\\ 直下のディレクトリを閲覧できちゃいます。なのでそれを防ぐためにごちゃごちゃとした設定をしています。Linux環境だともうちょっとシンプルに出来るはず。)

```C:\xampp\apache\conf\httpd.conf
DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">
   ～省略～
</Directory>

<Directory "C:\xampp\htdocs\ssoIdp\www">
    Allow from localhost
</Directory>
<Directory "C:\xampp\htdocs\ssoIdp">
    Deny from all
</Directory>
<Directory "C:\xampp\htdocs\ssoSp\www">
    Allow from localhost
</Directory>
<Directory "C:\xampp\htdocs\ssoSp">
    Deny from all
</Directory>

Alias /ssoIdp/ "C:/xampp/htdocs/ssoIdp/www/"
Alias /ssoSp/ "C:/xampp/htdocs/ssoSp/www/"
```

* 設定を反映させるため、Apacheを(再)起動します。

XAMPPのコンソールからApacheを「Start」します。既に起動済の場合は一度「Stop」してから再度「Start」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/a908d10f-f1b6-90ba-0aca-db50131f898d.png)




## <font color="#660033"><b>IdP</b></font>構築手順

* 設定ファイル「C:\\xampp\\htdocs\\<font color="#660033"><b>ssoIdp</b></font>\\config\\config.php」を編集します。

URLのパスを変更します。

```ssoIdp\config\config.php
'baseurlpath' => 'simplesaml/',
             ↓↓↓
'baseurlpath' => 'ssoIdp/', 
```

アドミニストレータのパスワードも変更します。（初期設定の値から変更しておかないとログインできないので。）

```ssoIdp\config\config.php
'auth.adminpassword' => '123',
             ↓↓↓
'auth.adminpassword' => '123456',
```

本記事の設定だと、同一サーバ内に<font color="#660033"><b>IdP</b></font>と<font color="#007c99"><b>SP</b></font>が存在するわけですが、以下の設定により<font color="#660033"><b>IdP</b></font>と<font color="#007c99"><b>SP</b></font>で別々のクッキーを使用するようにします。

```ssoIdp\config\config.php
'session.cookie.path' => '/',
             ↓↓↓
'session.cookie.path' => '/ssoIdp/',
```

<font color="#660033"><b>IdP</b></font>のsaml2.0の機能を有効化します。

```ssoIdp\config\config.php
'enable.saml20-idp' => false,
             ↓↓↓
'enable.saml20-idp' => true,
```

* 必須ではないですが、<font color="#660033"><b>IdP</b></font>の背景色を変更しておきます。
<font color="#660033"><b>IdP</b></font>と<font color="#007c99"><b>SP</b></font>で区別がつきにくいので、<font color="#660033"><b>IdP</b></font>の背景色を変更しちゃいます。

cssファイル「 <font color="#660033"><b>ssoIdp</b></font>\\www\\resources\\default.css 」を編集します。変更後の色は何でもいいですが、ここでは<font color="#660033"><b>赤紫色</b></font>にしています。

```ssoIdp\www\resources\default.css
body {
   /**省略**/
    background: #1c1c1c;
   /**省略**/
}
    ↓↓↓
body {
   /**省略**/
    background: #660033;
   /**省略**/
}
```


* <font color="#660033"><b>ssoIdp</b></font>への接続確認をします。

ウェブブラウザで「 https://localhost/ssoIdp/ 」に接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/192e612d-2c34-babc-dc51-5244f25496e9.png)

アドミニストレータでログインしてみましょう。[管理者でログイン]をクリックし、そこで先ほど設定した「ユーザ名:admin, パスワード:123456」を入力して[ログイン]ボタンをクリックしてください。ログインできれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/c1d2ff15-2040-c9dd-5fa2-b46638f1b71b.png)

* <font color="#660033"><b>IdP</b></font>のPHPの設定を確認しておきます。

[設定]タブで画面を切り替えて、画面右上の「SAML2.0IdP」のチェックが緑色でONになっていること、画面下部の「PHPの設定を確認」で"必須"の項目についてはチェックが緑色でONになっていることを確認します（なっていなかったらPHPのバージョンを上げたりモジュールを追加したりして対応します）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/8f5a5c50-1437-d584-a758-9523b4cbf037.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/1edd2e3e-259d-10f8-2ccb-02b7bb1bc949.png)



* 鍵ペアを <font color="#660033"><b>ssoIdp</b></font>\\cert 配下に配置します。

秘密鍵とオレオレ証明書を生成する必要があるのですが、今回は鍵の中身を用意しておくので適当に使ってください。<font color="red">無論、秘密鍵を公開しちゃってるので、実用には耐えません</font>が、個人の環境で遊ぶだけなら問題ないです。メモ帳などのテキストエディタで書き込んで、ファイル名を変更すれば鍵・証明書として使えます。

```ssoIdp\cert\server.pem
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDEeMeS3Tt6A90f
paGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwS
jrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgk
LmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK
64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJq
VtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZ
hg/QQ5aJAgMBAAECggEBAMONK6ckB+TkH502MHY9hQ6StYEB2Xo6wS8I+VV9Vse0
NP4La6CUhjuoOLrlJr7sXZHaGhzFVSfB73ExHH1bOQr1sN/92pv08CBK3dXmQiPP
90H4ju9BHByJ6J9ZWx1Mtl1qSzP+tAHgCDBq+KnPx25+P0NcvI3jOV4U8fPZGZGP
LuixuzWArfbWU+xEpDBX4aFW/PZHh05rWQxT3PQ0xYzCyo67DBa7UhqY3vFDlH/i
sSAU9mMm6M6lk7h6IAozYU51Y4IHI4pyWEFAgRBYLqFjEG/n8Yo/Zg+9kwAueDke
1I2ZbByUeY7zbhtNeWjYPAqXVX8HsXdKRy9eNm1jTwECgYEA+xifVS5ZYzctGBHI
ivoYR/DXrJPo4SVrCx8zcP9rIC1j0DV5doNBvNvObFe9UCMDmwybMZGlgv1kn7kE
RHJLoDISVJ6NGBNfEi/u2/coFSnc15AuAqyHzss4GoPZ9cmilGSGQbMIMEDKkzog
5h5fXIMPm1fWtEVl684pSbHuoLECgYEAyE8Ox5/yK8VXnS0c8dXWuj3lwJLJDOyW
d2ZeSjRRSRkw3D9/6dydgtMudBOc3Pbfll+MgWtFlKtIcECB51C5ePPTwjG9NEFG
dPeZWhuqVcoxRU1fJzEHUzA0bEbcgUebfzo+pSgHXGHUZaEasfzyKAvwZ4Xx6oPB
RYUn9TD/iVkCgYEAxRXeeg2XO7jjPDE5J1yGEnGH132BHLcx/djPl7Hjc64s2hAe
9lawEny02XVEstHI0rpiVdXsA5TAll2ya8cKdQLYQHLybCNITA4zfZPRcksZfFk+
w/qH3ljEAIvdWH6bjb4ZYxgTJUy1tDm7+ON+Fi8I4PVhIL4X8a4v2hg/JQECgYAU
XKT9+e5eMLNVUO6uTrSDPiOKzeEOJUauYIOZO3Q/4AWtfe780OZaFCmWtx+s/pN/
77qStVrfYAH/Fy+dWgFgoDiYdwHqu+/zl+/IzyMjkWgsyU6w5zT9adsKXrGvmp3d
8wfHNih5ZaB3rEbQbQwYsg4AGAeddUNCU+TZ8d8oEQKBgAxu4erzBwCdLC7ysAEt
G94NCT2umw3CeisZ9HJBeI0UvZN+vWjXDHNDm7A3DmBpqnaMx1WRSy6nsKB1Qojo
ouvwjS0YtRWU0ymKvsr6mo6sM/gtXvF4BSr00nytGvJB81q4TPTv2vawNY426o8H
SZX8awOsYIMwfygAeNAIXIjg
-----END PRIVATE KEY-----
```

```ssoIdp\cert\server.crt
-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAy
MDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJR
cFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQa
ug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH
+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z
+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiN
W3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1Ud
DgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgce
qmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9
QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N
4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghs
SAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEP
XnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3
hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB
5naNNb/AUw6sIBNL5cOi
-----END CERTIFICATE-----
```

このようなファイル構成になります。

```
C:\xampp\htdocs (←Apacheの制御下のフォルダ、環境の設定によって変わる)
　　　　　　└ ssoIdp
   　　　　　　└ cert
      　　　　　　├ server.pem
      　　　　　　└ server.crt
```

【補足】
<font color="#660033"><b>ssoIdp</b></font>\\metadata\\saml20-<font color="#660033"><b>idp</b></font>-hosted.php にて以下のように秘密鍵と証明書の設定をしているのですが、秘密鍵と証明書のファイル名を同じにしているので、こちらの設定を変更する必要はないです。

```ssoIdp\metadata\saml20-idp-hosted.php
    // X.509 key and certificate. Relative to the cert directory.
    'privatekey' => 'server.pem',
    'certificate' => 'server.crt',
```

* exampleauthを有効化します。

「 <font color="#660033"><b>ssoIdp</b></font>\\config\\config.php 」のmocule.enableの'exampleauth'の値をtrueにします。これでexampleauthの認証モジュールが使用できるようになります。（他にも使用可能な認証モジュールがあるのですが、ここではexampleauthを使用します。）

```ssoIdp\config\config.php
     'module.enable' => [
         'exampleauth' => true,
         'core' => true,
         'saml' => true
     ],
```

* example-userを有効化します

「 <font color="#660033"><b>ssoIdp</b></font>\\config\\authsources.php 」の以下の部分のコメントアウトを外します。これにより「ユーザ名：student、パスワード:studentpass」と「ユーザ名：employee、パスワード:employeepass」をユーザアカウントとして使用できるようになります。

```ssoIdp\config\authsources.php
    'example-userpass' => [
        'exampleauth:UserPass',

        // Give the user an option to save their username for future login attempts
        // And when enabled, what should the default be, to save the username or not
        //'remember.username.enabled' => false,
        //'remember.username.checked' => false,

        'student:studentpass' => [
            'uid' => ['test'],
            'eduPersonAffiliation' => ['member', 'student'],
        ],
        'employee:employeepass' => [
            'uid' => ['employee'],
            'eduPersonAffiliation' => ['member', 'employee'],
        ],
    ],
```

## <font color="#007c99"><b>SP</b></font>構築手順

* <font color="#007c99"><b>SP</b></font>の方の設定ファイルを以下のように変更します。

設定ファイル「C:\\xampp\\htdocs\\<font color="#007c99"><b>ssoSp</b></font>\\config\\config.php」を編集します。

URLのパスを変更します。

```ssoSp\config\config.php
'baseurlpath' => 'simplesaml/',
             ↓↓↓
'baseurlpath' => 'ssoSp/', 
```

アドミニストレータのパスワードも変更します。（初期設定の値から変更しておかないとログインできないので。）

```ssoSp\config\config.php
'auth.adminpassword' => '123',
             ↓↓↓
'auth.adminpassword' => '123456',
```

本記事の設定だと、同一サーバ内に<font color="#660033"><b>IdP</b></font>と<font color="#007c99"><b>SP</b></font>が存在するわけですが、以下の設定により<font color="#660033"><b>IdP</b></font>と<font color="#007c99"><b>SP</b></font>で別々のクッキーを使用するようにします。

```ssoSp\config\config.php
'session.cookie.path' => '/',
             ↓↓↓
'session.cookie.path' => '/ssoSp/',
```

* 必須ではないですが、<font color="#007c99"><b>SP</b></font>の背景色を変更しておきます。
<font color="#660033"><b>IdP</b></font>と<font color="#007c99"><b>SP</b></font>で区別がつきにくいので<font color="#007c99"><b>SP</b></font>の背景色を変更しちゃいます。

cssファイル「<font color="#007c99"><b>ssoSp</b></font>\\www\\resources\\default.css」を編集します。変更後の色は何でもいいですが、ここでは<font color="#007c99"><b>深い青</b></font>にしています。

```ssoSp\www\resources\default.css
body {
   /**省略**/
    background: #1c1c1c;
   /**省略**/
}
    ↓↓↓
body {
   /**省略**/
    background: #007c99;
   /**省略**/
}
```

* <font color="#007c99"><b>SP</b></font>への接続確認をします。

ウェブブラウザで「 https://localhost/ssoSp/ 」に接続します。
背景色を変更した場合、<font color="#660033"><b>IdP</b></font>だと背景が<font color="#660033"><b>赤紫色</b></font>でしたけど、<font color="#007c99"><b>SP</b></font>だと<font color="#007c99"><b>深い青</b></font>になってますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/c3a099b6-9650-ae18-fe97-547f2189ede3.png)

* 鍵ペアの設定をします。

<font color="#660033"><b>IdP</b></font>の時と同様に、秘密鍵とオレオレ証明書を生成して配置します。今回はローカル環境での個人的な利用なので<font color="#660033"><b>IdP</b></font>と同じ鍵ペアを使用します（無論、個別に生成した鍵ペアを使用してもらっても構いません）。秘密鍵(server.pem)と証明書(server.crt)を「 <font color="#007c99"><b>ssoSp</b></font>\\cert\\ 」配下に配置します。

このようなファイル構成になります。

```
C:\xampp\htdocs (←Apacheの制御下のフォルダ、環境の設定によって変わる)
　　　　　　└ ssoSp
   　　　　　　└ cert
      　　　　　　├ server.pem
      　　　　　　└ server.crt
```

その上で「 <font color="#007c99"><b>ssoSp</b></font>\\config\\authsources.php 」の設定を以下のように変更します。

```ssoSp\config\authsources.php
    // An authentication source which can authenticate against both SAML 2.0
    // and Shibboleth 1.3 IdPs.
    'default-sp' => [
        'saml:SP',

        // The entity ID of this SP.
        // Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
        'entityID' => null,
        ～省略～
    ],

       ↓↓↓

    // An authentication source which can authenticate against both SAML 2.0
    // and Shibboleth 1.3 IdPs.
    'default-sp' => [
        'saml:SP',

        'privatekey' => 'server.pem',
        'certificate' => 'server.crt',

        // The entity ID of this SP.
        // Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
        'entityID' => 'https://localhost/ssoSp/',
        ～省略～
    ],
```

## SSO連携手順

<font color="#660033"><b>IdP</b></font>と<font color="#007c99"><b>SP</b></font>の双方が互いについての情報を把握しておく必要があるため、<b>互いにメタデータを交換します</b>。例えるなら<font color="#660033"><b>IdP</b></font>と<font color="#007c99"><b>SP</b></font>で名刺交換をするようなものです。これにより<font color="#660033"><b>IdP</b></font>と<font color="#007c99"><b>SP</b></font>との間に信頼関係が形成されるのでSSO連携をすることができるのです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/83d935a1-b3e9-e601-8ebb-2b824e153102.png" width="200" />*image by: irasutoya.com*

【補足】
SAMLのサーバによってはメタデータの交換をするのではなく、<font color="#660033"><b>IdP</b></font>の証明書を<font color="#007c99"><b>SP</b></font>に登録するだけのものも多々あります。他にはメタデータをダウンロードできるURLを設定する仕組みのものもあります。


* <font color="#660033"><b>IdP</b></font>→<font color="#007c99"><b>SP</b></font>へのメタデータ登録

<font color="#660033"><b>IdP</b></font>サーバの設定ページ( https://localhost/ssoIdp/ )の[連携]タブを開き、"SAML 2.0 <font color="#660033"><b>IdP</b></font>メタデータ"項の[メタデータを表示]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/d9f8e7c7-4b56-41ad-44b9-b3dc776aed60.png)

"メタデータ"項の下の方の「SimpleSAMLphpのファイルフォーマット」をコピーします、XML表記ではなくPHP表記の方です。右上のアイコンをクリックするとクリップボードにコピーできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/f58bedc8-4913-b0ad-8de7-690d73d4fa69.png)

以下のように、<font color="#007c99"><b>SP</b></font>サーバのmetadeta設定ファイル( <font color="#007c99"><b>ssoSp</b></font>\\metadata\\saml20-<font color="#660033"><b>idp</b></font>-remote.php )の末尾にコピーした設定を追記します。

```ssoSp\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://localhost/ssoIdp/saml2/idp/metadata.php'] = [
    'metadata-set' => 'saml20-idp-remote',
    'entityid' => 'https://localhost/ssoIdp/saml2/idp/metadata.php',
    'SingleSignOnService' => [
        [
            'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
            'Location' => 'https://localhost/ssoIdp/saml2/idp/SSOService.php',
        ],
    ],
    'SingleLogoutService' => [
        [
            'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
            'Location' => 'https://localhost/ssoIdp/saml2/idp/SingleLogoutService.php',
        ],
    ],
    'certData' => 'MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAyMDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1UdDgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgceqmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghsSAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEPXnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB5naNNb/AUw6sIBNL5cOi',
    'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
];
```

* <font color="#007c99"><b>SP</b></font>→<font color="#660033"><b>IdP</b></font>へのメタデータ登録

<font color="#007c99"><b>SP</b></font>サーバの設定ページ( https://localhost/ssoSp/ )の[連携]タブを開き、"SAML 2.0 <font color="#007c99"><b>SP</b></font>メタデータ"項の[メタデータを表示]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/41335d9b-13ab-ac8e-97c6-69a0fd35704d.png)

"メタデータ"項の下の方の「SimpleSAMLphpのファイルフォーマット」をコピーします、XML表記ではなくPHP表記の方です。右上のアイコンをクリックするとクリップボードにコピーできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/12a99cba-c509-0701-0d87-9098de270462.png)

以下のように、<font color="#660033"><b>IdP</b></font>サーバのmetadeta設定ファイル( <font color="#660033"><b>ssoIdp</b></font>\\metadata\\saml20-<font color="#007c99"><b>sp</b></font>-remote.php )の末尾にコピーした設定を追記します。


```ssoIdp\metadata\saml20-sp-remote.php
<?php
/** 省略 **/

$metadata['https://localhost/ssoSp/'] = [
    'SingleLogoutService' => [
        [
            'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
            'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml2-logout.php/default-sp',
        ],
    ],
    'AssertionConsumerService' => [
        [
            'index' => 0,
            'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
            'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp',
        ],
        [
            'index' => 1,
            'Binding' => 'urn:oasis:names:tc:SAML:1.0:profiles:browser-post',
            'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml1-acs.php/default-sp',
        ],
        [
            'index' => 2,
            'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact',
            'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp',
        ],
        [
            'index' => 3,
            'Binding' => 'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01',
            'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml1-acs.php/default-sp/artifact',
        ],
    ],
    'certData' => 'MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAyMDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1UdDgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgceqmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghsSAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEPXnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB5naNNb/AUw6sIBNL5cOi',
];
```

* テストSSOログイン

<font color="#007c99"><b>SP</b></font>( https://localhost/ssoSp/ )の[認証]タブの「設定されている認証元をテスト」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/0bcba843-daeb-97f2-4c4a-852ddae3786a.png)

default-sp を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/74c622ce-2a76-b5d3-59a3-1e328eee25e1.png)

登録している<font color="#660033"><b>IdP</b></font>（ここでは１つだけですが）を選んで、[選択]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/3f652a81-3313-d6b2-ed70-43e013974352.png)

<font color="#007c99"><b>SP</b></font>から<font color="#660033"><b>IdP</b></font>に<b>SAMLRequest</b>が送信されるとともに、<font color="#660033"><b>IdP</b></font>のログイン画面へ遷移しますので、以前の手順で設定したユーザアカウントのIDとパスワード(ユーザ名：student, パスワード : studentpass、及び、ユーザ名 ： employee, パスワード : employeepass)を入力し、[ログイン]をクリックしてくだい。ちなみにすでに<font color="#660033"><b>IdP</b></font>での認証が済んでいる場合は、この画面はスキップされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/075513bc-11a8-9433-2067-f7fef495d35e.png)

<font color="#660033"><b>IdP</b></font>での認証に成功すると、<font color="#660033"><b>IdP</b></font>から<b>SAMLResponse</b>が<font color="#007c99"><b>SP</b></font>に送信され、それの検証により<font color="#007c99"><b>SP</b></font>での認証が完了します。下の画像は<font color="#007c99"><b>SP</b></font>での認証に成功したときのものです。これで一通りの手順はおしまいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/748b9c6e-46d8-06fd-07fd-262ed70b4b2e.png)


## おまけ：SAML連携時の通信の中身を見てみる
SAMLの仕様とか各要素とかについては[OASISの仕様書](https://docs.oasis-open.org/security/saml/v2.0/)を見ていただくと良いとは思うのですが、いかんせん量が多く慣れないと結構しんどいです。マニアックな内容なのでそうそう慣れる機会は無いとは思いますが。

* SAMLRequest(※デコード&整形しています。)

```xml:SAMLRequest
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_6bbcd43e1ec075d4ebf68dfe874f452bcace577438" Version="2.0" IssueInstant="2020-09-21T23:33:59Z" Destination="https://localhost/ssoIdp/saml2/idp/SSOService.php" AssertionConsumerServiceURL="https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST">
  <saml:Issuer>https://localhost/ssoSp/</saml:Issuer>
  <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient" AllowCreate="true" />
</samlp:AuthnRequest>
```

* SAMLResponse(※デコード&整形しています。)

```xml:SAMLResponse
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_c80d4705c4a781d20a6fde29643079ceada2e5d323" Version="2.0" IssueInstant="2020-09-21T23:34:07Z" Destination="https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp" InResponseTo="_6bbcd43e1ec075d4ebf68dfe874f452bcace577438">
  <saml:Issuer>https://localhost/ssoIdp/saml2/idp/metadata.php</saml:Issuer>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
      <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
      <ds:Reference URI="#_c80d4705c4a781d20a6fde29643079ceada2e5d323">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
        <ds:DigestValue>VRzn0Gt54eGrC/5QNppWD8uFoyA1/n+8NoywV80mV+4=</ds:DigestValue>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>DYPl40JAe/KO8bYL/XR0DjrUr5gAPkz48Hdk82sDsA+dJeEuNDjvMptuXo6TVdQKddj0URHApuLLklgRmENhqkGQub1fYCKkAaj2XX3VrMvktkiyLMXW8fTtk0meiQv9ccgfLcevlLpFs7cUPcrHU9jXYx4HyqxqlI/8dzOg7DazzinJTpyVxfuWmQ7h9IBPesn7gXE+zWyJZhnRn+9vH5GjLZaS9+i1DXlk48RS40JZo4eJUu4gXMRvgfp4iOQI2mg31p0ojiGJPMjNCAzlKAHtNYJmsZWeDo5CLhUq8EYZsDp9xWLo5qHkq8RYtkXp8eWlyVCHq1vvMqBNX+v41w==</ds:SignatureValue>
    <ds:KeyInfo>
      <ds:X509Data>
        <ds:X509Certificate>MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAyMDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1UdDgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgceqmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghsSAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEPXnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB5naNNb/AUw6sIBNL5cOi</ds:X509Certificate>
      </ds:X509Data>
    </ds:KeyInfo>
  </ds:Signature>
  <samlp:Status>
    <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
  </samlp:Status>
  <saml:Assertion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="_3c8f7884ed17561a8fdbbf9d11a70064ffbd3d76a6" Version="2.0" IssueInstant="2020-09-21T23:34:07Z">
    <saml:Issuer>https://localhost/ssoIdp/saml2/idp/metadata.php</saml:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
      <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
        <ds:Reference URI="#_3c8f7884ed17561a8fdbbf9d11a70064ffbd3d76a6">
          <ds:Transforms>
            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
          </ds:Transforms>
          <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
          <ds:DigestValue>f880DlkRbn8Jjhks7A9xBSLrkBOH0k7f1XVxiPOt6Qk=</ds:DigestValue>
        </ds:Reference>
      </ds:SignedInfo>
      <ds:SignatureValue>PlpGL7o08rqHjN/jzN1nf3TrtphGyPY2+DKo3KYlCF/W6WMtMqvo4RdQKluUMzJixAQL10y9FuHgdLoziA1IMtwARKfbn8W3dqu5OVbmqghD6joYztSblUpJWlsttl26dwvr8ZVgHnf4ZZCydmGS/f9Jgep5oFGtBT60/k8kacb15uThCKHiiyr3ZpmE1y1HLfxEhgqD4SNhd1IpDUipe3fEXBEVHwjotZsOHvMuvXzA1GtRmW2myKT5RJq81oxzTO2t1gwg05N+XnrbGH95G228gReFs63dzu+gUo7fa7jNXqvNMe+MWEKOj7qMv0HdS5MC5xWOB/PcMQUCJkVQbQ==</ds:SignatureValue>
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAyMDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1UdDgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgceqmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghsSAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEPXnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB5naNNb/AUw6sIBNL5cOi</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </ds:Signature>
    <saml:Subject>
      <saml:NameID SPNameQualifier="https://localhost/ssoSp/" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">_775c636d1fd3fb01bcc4cf55049b2449cbdaed9ad8</saml:NameID>
      <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
        <saml:SubjectConfirmationData NotOnOrAfter="2020-09-21T23:39:07Z" Recipient="https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp" InResponseTo="_6bbcd43e1ec075d4ebf68dfe874f452bcace577438" />
      </saml:SubjectConfirmation>
    </saml:Subject>
    <saml:Conditions NotBefore="2020-09-21T23:33:37Z" NotOnOrAfter="2020-09-21T23:39:07Z">
      <saml:AudienceRestriction>
        <saml:Audience>https://localhost/ssoSp/</saml:Audience>
      </saml:AudienceRestriction>
    </saml:Conditions>
    <saml:AuthnStatement AuthnInstant="2020-09-21T23:34:07Z" SessionNotOnOrAfter="2020-09-22T07:34:07Z" SessionIndex="_6152d2e9dad940750f2e9921202ebfb8d43e11c089">
      <saml:AuthnContext>
        <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
      </saml:AuthnContext>
    </saml:AuthnStatement>
    <saml:AttributeStatement>
      <saml:Attribute Name="uid" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml:AttributeValue xsi:type="xs:string">test</saml:AttributeValue>
      </saml:Attribute>
      <saml:Attribute Name="eduPersonAffiliation" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml:AttributeValue xsi:type="xs:string">member</saml:AttributeValue>
        <saml:AttributeValue xsi:type="xs:string">student</saml:AttributeValue>
      </saml:Attribute>
    </saml:AttributeStatement>
  </saml:Assertion>
</samlp:Response>
```


### 以上