SP-Initiated と IdP-Initiated の動作の違いを Fiddler を見ながら確認してみる

#はじめに
Azure AD は SAML 2.0 プロトコルを使って、多くの 3rd パーティー製アプリケーションとのシングル サインオンを構成することが可能ですが、その動作が SP-Initiated なのか、 IdP-Initiated なのか意識したことがあるでしょうか。

私も正直 MS に Join した当初はその動作の違いが全く理解できていなかったのですが、 SP (Service Provider) により、 SP-Initiated のみ対応しているとか、その逆で IdP-Initiated のみ対応しているとか、または両方対応している、といったように、同じシングル サインオンでも動作の違いがあります。

今回は、 Salesforce と AWS の 2 つのアプリケーションを使って、Fiddler を取りながら SP-Initiated と IdP-Initiated の動作の違いを見てみたいと思います。
念のため補足ですが、 Azure AD と 3rd パーティー製アプリケーションを SAML 2.0 を使って統合する場合、 IdP (Identity Provider) が Azure AD で、 SP (Service Provider) が 3rt パーティー製アプリケーションになります。

#SP-Initiated シングル サインオンの動作について

SP-Initiated のシングル サインオンの動作は、下記 Microsoft 公開情報にも記載されています。

-参考情報
シングル サインオンの SAML プロトコル
URL:https://docs.microsoft.com/ja-jp/azure/active-directory/develop/single-sign-on-saml-protocol

上記を見て気づいたのですが、 IdP-Initiated の動きを記載した弊社のドキュメントがないんですよね…。
別途弊社開発に要望を出してみたいと思います。

SP-Initiated の動作を文章で書くと下記のような流れになります。

1. ユーザーがブラウザーを使って、 SP (Service Provider) にアクセスします。
具体的には Azure AD の下記 サインオン URL にアクセスしに行きます。	

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/8497074f-e880-0909-6dbf-96dd159d9e9d.png)

2.SP (Service Provider) はアクセスしてきたユーザーが Azure AD ユーザーかどうかを確認します。
3. SP (Service Provider) が SAML Request と共に、ユーザーを IdP (Identity Provider) にリダイレクトさせます。
4. リダイレクトされた IdP 側で Azure AD ユーザーがサインインしていない場合は Azure AD が認証を要求し、認証に成功した場合、署名をした SAML Response をユーザーに渡します。
5. 署名された SAML レスポンスは、ユーザーが利用しているブラウザを通して、 SP 側に渡されます。
6. SAML Response を受け取った SP側で SAML Response の内容をチェックします。
7. SAML Response の内容が、 SP 側が要求した SAML Request の要件を満たしていれば、 SP 側がユーザーにサインオンの許可を与えます。 

上記一連の流れを経て、ユーザーは SP にシングル サインオンできるようになります。
SP-Initiated と呼ばれる理由としては、書いて字の通り、一番初めの動作がユーザーが SP (Service Provider) にアクセスするためです。

#IdP-Initiated シングル サインオンの動作について

IdP-Initiated の動作を文章で書くと下記のような流れになります。

1. ユーザーがブラウザーを使って、 IdP にアクセスし、 Auzre AD が認証を要求します。
具体的には Azure AD の下記 ログイン URL にアクセスしに行きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/e3dd8503-7691-6242-1648-0586a893b532.png)

2.ユーザーがユーザー/パスワードなどで認証を行います。
3. IdP が署名された SAML Response を作成し、ユーザーに渡します。
4. 署名された SAML レスポンスは、ユーザーが利用しているブラウザを通して、 SP 側に渡されます。
5. SAML Response を受け取った SP側で SAML Response の内容をチェックします。
6. SAML Response の内容が、 SP 側が要求した SAML Request の要件を致していれば、 SP 側がユーザーにサインオンの許可を与えます。 

上記一連の流れを経て、ユーザーは SP にシングル サインオンできるようになります。
IdP-Initiated と呼ばれる理由としては、書いて字の通り、一番初めの動作がユーザーが IdP (Identity Provider) にアクセスするためです。


#Salesforce にシングル サインオンして、 SP-Initiated の流れを確認してみる。

では実際に Fiddler を取りながら、 SP-Initiated の流れを見てみます。 
Fiddler の使い方については、下記ブログを参考にしてみてください。

-参考情報
HTTPS パケット キャプチャ ツール Fiddler のインストールから使用開始まで。
URL:https://qiita.com/Shinya-Yamaguchi/items/37347ec532824c2dccad

アクセス パネル(myapps.microsoft.com) より Salesforce01 のアイコンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/a18fbc8b-4598-2549-4c5d-ee02e6cc074b.png)

Salesforce の画面より、「sts」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/c69fbf41-efd0-a99d-071e-3c649d8d42f0.png)

Salesforce にシングル サインオンできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/0a3c91fa-3755-dd00-fd53-59b229544123.png)

### Fiddler のパケットを確認してみる。

「SP-Initiated シングル サインオンの動作について」で書いたように、11 行目で Salesforce (https://yamaguchi014.my.salesforce.com/) にアクセスしていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/ab1fe853-2073-4363-59d5-35fc5e31308b.png)

177 行目で リダイレクト先の IdP (Azure AD) が SAML Request を受け取っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/357c1c9d-e1c6-0061-8364-b7f39bbb68c7.png)

Fiddler で SAML Request の中身を見る時は SAML Request の Value を右クリックし、「Send to TextWizard」をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/7d11262b-9f5a-41b3-c181-3acf081b1753.png)

Transform のプルダウンメニューを「From DeflatedSAML」に変更すると、 SAML Request の生データを見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/dd8fe268-d8aa-e0fd-4c7b-75901f762680.png)


画面ショットでは中身を確認しづらいなので、テキスト ファイルを下記に転記します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL="https://yamaguchi014.my.salesforce.com?so=00D2v000000O03g" Destination="https://login.microsoftonline.com/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/saml2" ID="_2CAAAAWt-GtAuME8wMnYwMDAwMDA4T0k3AAAA2unyZEPHB6ldR62kRe-d9aWyRnhbqzMU70m2BgXnqUSC2nA-3snOARfXMxrDTZ0_ABc4KH58gKfHdk0hPuwR5D4u03ntgfIhiN-UKVw1BcAvZXzcJtwvCgaca8_k1umLCvvtP8Bwb5pMmmLt5KKc_fx7Pma4BvWyU5IhQKLlQ2753KGQ2PiyBMEszDCq-k6q8MzZizArOulgQ0cKvKp1m6Q4WLlMYCkZBlVRkOqj8kB_wH1ZqQ5LYAKoddBm4P-8xA" IssueInstant="2019-05-25T07:33:40.506Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0">
  <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://yamaguchi014.my.salesforce.com</saml:Issuer>
</samlp:AuthnRequest>
```

Azure AD のシングル サインオンの設定と比較してみます。
基本的な SAML 構成 

識別子 (エンティティ ID)
https://yamaguchi014.my.salesforce.com

応答 URL (Assertion Consumer Service URL)
https://\*.my.salesforce.com/*

サインオン URL
https://yamaguchi014.my.salesforce.com

エンティティ ID は SMAL Request の中の 

```xml
 <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://yamaguchi014.my.salesforce.com</saml:Issuer>
```

と一致させる必要があります。逆に SAML Request に含まれる Issuer URL と Azure AD の設定が一致しない場合、シングル サインオンは失敗します。

応答 URL  (AssertionConsumerServiceURL="https://yamaguchi014.my.salesforce.com?so=00D2v000000O03g" Destination="https://login.microsoftonline.com/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/saml2") は Azure AD の応答 URL (https://\*.my.salesforce.com/*) と一致させる必要があります。

181 行目で IdP (Azure AD) が SAML Response を返しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/11ba12ac-10f6-2fa5-268a-de76d0527900.png)

SAML Response の中身は下記のとおりです。

```xml
<samlp:Response ID="_14ed8238-5d1d-42e7-a249-5f0a349662ec" Version="2.0" IssueInstant="2019-05-25T07:33:41.008Z" Destination="https://yamaguchi014.my.salesforce.com?so=00D2v000000O03g" InResponseTo="_2CAAAAWt-GtAuME8wMnYwMDAwMDA4T0k3AAAA2unyZEPHB6ldR62kRe-d9aWyRnhbqzMU70m2BgXnqUSC2nA-3snOARfXMxrDTZ0_ABc4KH58gKfHdk0hPuwR5D4u03ntgfIhiN-UKVw1BcAvZXzcJtwvCgaca8_k1umLCvvtP8Bwb5pMmmLt5KKc_fx7Pma4BvWyU5IhQKLlQ2753KGQ2PiyBMEszDCq-k6q8MzZizArOulgQ0cKvKp1m6Q4WLlMYCkZBlVRkOqj8kB_wH1ZqQ5LYAKoddBm4P-8xA" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://sts.windows.net/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/</Issuer>
  <samlp:Status>
    <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
  </samlp:Status>
  <Assertion ID="_08dff9d6-c9ce-4d9f-8ef9-83e025400b00" IssueInstant="2019-05-25T07:33:40.995Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
    <Issuer>https://sts.windows.net/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/</Issuer>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
      <SignedInfo>
        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
        <Reference URI="#_08dff9d6-c9ce-4d9f-8ef9-83e025400b00">
          <Transforms>
            <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
            <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
          </Transforms>
          <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
          <DigestValue>XYB8qhvWdLrnngIU4WXToCIK+1ITRg6c+How+rejlro=</DigestValue>
        </Reference>
      </SignedInfo>
      <SignatureValue>C+1XWuqzPEtuDWaqs0jG9FxTX0lnNa4rFgqKKL7kSFW9Yq4TMIuMxdqDBEeYnkBYR/u9GiUGS0XZkLKZ8bwEw6cYK3mfwvf9p/9CNyIbHylNxmGUsUonfhjFe+qjbrLJj2TNWGW6hWTOvmJO5PLzS0AShLAOMDv2sBs/YIf9zzIa1gtEIBGhreDbG0MStnRrfCwLPFOHSzCpWJD4tfq3J01Gnjvqqf0vBL1zKGAw2i2FjmLqaYn3LnDG8Xr/wFq6LhDJkStzBKRCh5LU3FDwFqkQM6C5llyN7lSNdoZGrlf+wcrbX5iKymhYSCwDf7baOCbl8mRGsbeUsnttyGT7Eg==</SignatureValue>
      <KeyInfo>
        <X509Data>
          <X509Certificate>xxx</X509Certificate>
        </X509Data>
      </KeyInfo>
    </Signature>
    <Subject>
      <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test001@shyamag014.onmicrosoft.com</NameID>
      <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
        <SubjectConfirmationData InResponseTo="_2CAAAAWt-GtAuME8wMnYwMDAwMDA4T0k3AAAA2unyZEPHB6ldR62kRe-d9aWyRnhbqzMU70m2BgXnqUSC2nA-3snOARfXMxrDTZ0_ABc4KH58gKfHdk0hPuwR5D4u03ntgfIhiN-UKVw1BcAvZXzcJtwvCgaca8_k1umLCvvtP8Bwb5pMmmLt5KKc_fx7Pma4BvWyU5IhQKLlQ2753KGQ2PiyBMEszDCq-k6q8MzZizArOulgQ0cKvKp1m6Q4WLlMYCkZBlVRkOqj8kB_wH1ZqQ5LYAKoddBm4P-8xA" NotOnOrAfter="2019-05-25T07:38:40.995Z" Recipient="https://yamaguchi014.my.salesforce.com?so=00D2v000000O03g" />
      </SubjectConfirmation>
    </Subject>
    <Conditions NotBefore="2019-05-25T07:28:40.995Z" NotOnOrAfter="2019-05-25T08:28:40.995Z">
      <AudienceRestriction>
        <Audience>https://yamaguchi014.my.salesforce.com</Audience>
      </AudienceRestriction>
    </Conditions>
    <AttributeStatement>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/tenantid">
        <AttributeValue>d6a725a7-fde0-4d2a-ab70-843f0d5bf595</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
        <AttributeValue>68d05d39-13f7-43c2-bb15-f98e84895472</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/displayname">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/identityprovider">
        <AttributeValue>https://sts.windows.net/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/claims/authnmethodsreferences">
        <AttributeValue>http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
    </AttributeStatement>
    <AuthnStatement AuthnInstant="2019-05-25T07:30:58.412Z" SessionIndex="_08dff9d6-c9ce-4d9f-8ef9-83e025400b00">
      <AuthnContext>
        <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</AuthnContextClassRef>
      </AuthnContext>
    </AuthnStatement>
  </Assertion>
</samlp:Response>
```

注目すべきパラメーターを何点かピックアップします。

###### 署名

```xml
<SignatureValue>C+1XWuqzPEtuDWaqs0jG9FxTX0lnNa4rFgqKKL7kSFW9Yq4TMIuMxdqDBEeYnkBYR/u9GiUGS0XZkLKZ8bwEw6cYK3mfwvf9p/9CNyIbHylNxmGUsUonfhjFe+qjbrLJj2TNWGW6hWTOvmJO5PLzS0AShLAOMDv2sBs/YIf9zzIa1gtEIBGhreDbG0MStnRrfCwLPFOHSzCpWJD4tfq3J01Gnjvqqf0vBL1zKGAw2i2FjmLqaYn3LnDG8Xr/wFq6LhDJkStzBKRCh5LU3FDwFqkQM6C5llyN7lSNdoZGrlf+wcrbX5iKymhYSCwDf7baOCbl8mRGsbeUsnttyGT7Eg==</SignatureValue>
```

IdP (Azure AD) は Azure AD ユーザーのサインオンが成功したあとに、 SAML Request の Assertion に署名をします。
つまり、このユーザーはちゃんと Azure AD が認証したユーザーだから SP (Salesforce) にアクセスさせても問題ないよ、とハンコを押すようなイメージです。

###### 属性

```xml
    <AttributeStatement>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/tenantid">
        <AttributeValue>d6a725a7-fde0-4d2a-ab70-843f0d5bf595</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
        <AttributeValue>68d05d39-13f7-43c2-bb15-f98e84895472</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/displayname">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/identityprovider">
        <AttributeValue>https://sts.windows.net/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/claims/authnmethodsreferences">
        <AttributeValue>http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
    </AttributeStatement>
```

属性 (Attribute) は Azure AD が保持していて、 下記画面ショットにある、ユーザー属性とクレームに記載されている値を SP (Salesforce) に返します。
今回は user.userprincipalname を値として返す必要があります。
具体的には、 <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>という値が含まれていることがわかります![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/b960bfed-82bd-b795-93e9-bcde496f283b.png)

上記のとおり、SP-Initiated では、 SP (Salesforce) が SAML Request を送って、 IdP (Azure AD) が SAML Response を返すという動作になります。


#AWS にシングル サインオンして、 IdP-Initiated の流れを確認してみる。

今度は、Fiddler を取りながら、 AWS にシングル サインオンしてみます。

アクセス パネル(myapps.microsoft.com) より Amazon Web Services のアイコンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/187dc69c-14c9-9b06-fa49-dfc4e7a49e19.png)

すると、 SP (AWS) の画面ではなく、 IdP (Azure AD) のサインイン画面が表示されます。
Azure AD が認証要求をしているので、資格情報を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/db94b4df-dbca-2757-3566-4ae0ceeefc4f.png)

シングル サインオンするアカウントを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/b07fe42d-59c9-68ef-1787-4f47aa35bc7e.png)

認証が成功すると、 AWS にシングル サインオンできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/c15bc3c8-b6a6-47aa-b5ed-a18ce26dffd3.png)

### Fiddler のパケットを確認してみる。

「IdP-Initiated シングル サインオンの動作について」で触れたように、 6 行目に IdP (Azure AD) のログイン URL にアクセスしていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/4c9ee3cf-505a-98ab-e049-527dd471f6cd.png)

次に 31 行目で Azure AD 上で資格情報を入力していることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/e501cdb1-e06f-2fe7-edae-ec170bb9bfe8.png)

63 行目で SAML Request が生成されています。
これは目から鱗でした。なぜなら、 SP (AWS) に一度もアクセスしてないのに、 SAML Request が IdP (Azure AD) から生成されているからです。
中身を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/167f92c9-1a9d-9ebb-e920-60a7bfcf0a9c.png)

せっかくなので、 IdP-Initiated の SAML Request と SP-Initiated の SAML Request を比較してみましょう。
こちらが IdP-Initiated の SAML Request

```xml
<samlp:AuthnRequest xmlns="urn:oasis:names:tc:SAML:2.0:metadata" ID="F84D888AA3B44C1B844375A4E8210D9E" Version="2.0" IssueInstant="2019-05-25T09:05:57.748Z" IsPassive="false" AssertionConsumerServiceURL="https://signin.aws.amazon.com/saml" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://signin.aws.amazon.com/saml</Issuer>
  <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">
  </samlp:NameIDPolicy>
</samlp:AuthnRequest>
```

こちらが SP-Initiated の SAML Request

```xml
<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL="https://yamaguchi014.my.salesforce.com?so=00D2v000000O03g" Destination="https://login.microsoftonline.com/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/saml2" ID="_2CAAAAWt-GtAuME8wMnYwMDAwMDA4T0k3AAAA2unyZEPHB6ldR62kRe-d9aWyRnhbqzMU70m2BgXnqUSC2nA-3snOARfXMxrDTZ0_ABc4KH58gKfHdk0hPuwR5D4u03ntgfIhiN-UKVw1BcAvZXzcJtwvCgaca8_k1umLCvvtP8Bwb5pMmmLt5KKc_fx7Pma4BvWyU5IhQKLlQ2753KGQ2PiyBMEszDCq-k6q8MzZizArOulgQ0cKvKp1m6Q4WLlMYCkZBlVRkOqj8kB_wH1ZqQ5LYAKoddBm4P-8xA" IssueInstant="2019-05-25T07:33:40.506Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0">
  <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://yamaguchi014.my.salesforce.com</saml:Issuer>
</samlp:AuthnRequest>
```

IdP-Initiated の SAML Request の中身で気づいたのが以下のパラメーター

```xml
 <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">
```

上述で添付した公開情報には下記のとおりに記載されています。

>NameIDPolicy を指定する場合は、省略可能な Format 属性を含めることができます。 Format 属性で指定できる値は次のいずれかのみであり、それ以外の値はエラーになります。

>urn:oasis:names:tc :SAML:2.0:nameid-format:persistent:Azure Active Directory は、一対の識別子として NameID 要求を発行します。

>urn:oasis:names:tc :SAML:1.1:nameid-format:emailAddress:Azure Active Directory は、電子メール アドレス形式で NameID 要求を発行します。

> **urn:oasis:names:tc :SAML:1.1:nameid-format:unspecified:この値は、Azure Active Directory が要求の形式を選択することを許可します。 Azure Active Directory は、一対の識別子として NameID 要求を発行します。**

>urn:oasis:names:tc :SAML:2.0:nameid-format:transient:Azure Active Directory は、現在の SSO 操作に固有となる無作為に生成された値として NameID 要求を発行します。 つまり、値は一時的であり、認証ユーザーの識別に使うことはできません。

これは推測ですが、 Azure AD 自身が SAML Request を発行しているので、「format が unspecified つまり、 Azure AD が SAML Response の出力形式を決めることができる」と理解しました。
さて、 Fiddler の続きを見てみます。


92 行目で IdP (Azure AD) が SAML Response を返しています。中身を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/f864f92e-5fe2-608f-dc1a-d443b87403af.png)

```xml
<samlp:Response ID="_0284db5c-501e-4abc-b6fa-3bd1ba5e8644" Version="2.0" IssueInstant="2019-05-25T09:02:16.527Z" Destination="https://signin.aws.amazon.com/saml" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://sts.windows.net/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/</Issuer>
  <samlp:Status>
    <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
  </samlp:Status>
  <Assertion ID="_c193236e-d958-4629-8adf-b2cb90e10c00" IssueInstant="2019-05-25T09:02:16.511Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
    <Issuer>https://sts.windows.net/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/</Issuer>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
      <SignedInfo>
        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
        <Reference URI="#_c193236e-d958-4629-8adf-b2cb90e10c00">
          <Transforms>
            <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
            <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
          </Transforms>
          <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
          <DigestValue>Kg4PGyi8IBkHEs1y86N3uq7zML7buiuhphRYbuXAn7E=</DigestValue>
        </Reference>
      </SignedInfo>
      <SignatureValue>AXeD5TfWBl2xGkrPwuJCarm4skgRJpfxCNHzcZt1V6eHmjP8I1r12QwXnlAa9SRX8mSKJL4T93Rz9tEmw1vIHPUPz3ZSrw8soCfW8FMsi4zeXNtMiTWlUCuM/YpfUlSqgZaAayh0TGzNn/jARBtGCJb+oB2lBJhND2f6Rso9tceLwXTzOsm4jtO/KxEsPqW2Pj4gc77IggOskVR9KCfIweBdAAr6BZhyZ0vrEZ1fCbL93c2FGs+eAO/4VFIysydrpiH0rcgTlMIMmfSKYY4qk4iFOs/cwD6yVuISlydlCBrBlfZ4+A8tahj4ebnW712DfgIlzK06zzsZg7v4QR19NQ==</SignatureValue>
      <KeyInfo>
        <X509Data>
          <X509Certificate>xxx</X509Certificate>
        </X509Data>
      </KeyInfo>
    </Signature>
    <Subject>
      <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test001@shyamag014.onmicrosoft.com</NameID>
      <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
        <SubjectConfirmationData NotOnOrAfter="2019-05-25T09:07:16.511Z" Recipient="https://signin.aws.amazon.com/saml" />
      </SubjectConfirmation>
    </Subject>
    <Conditions NotBefore="2019-05-25T08:57:16.511Z" NotOnOrAfter="2019-05-25T09:57:16.511Z">
      <AudienceRestriction>
        <Audience>https://signin.aws.amazon.com/saml</Audience>
      </AudienceRestriction>
    </Conditions>
    <AttributeStatement>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/tenantid">
        <AttributeValue>d6a725a7-fde0-4d2a-ab70-843f0d5bf595</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
        <AttributeValue>68d05d39-13f7-43c2-bb15-f98e84895472</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/displayname">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/identityprovider">
        <AttributeValue>https://sts.windows.net/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/claims/authnmethodsreferences">
        <AttributeValue>http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/ws/2008/06/identity/claims/role">
        <AttributeValue>arn:aws:iam::259358134580:role/shyamag014,arn:aws:iam::259358134580:saml-provider/shyamag014</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/Role">
        <AttributeValue>arn:aws:iam::259358134580:role/shyamag014,arn:aws:iam::259358134580:saml-provider/shyamag014</AttributeValue>
      </Attribute>
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration">
        <AttributeValue>900</AttributeValue>
      </Attribute>
    </AttributeStatement>
    <AuthnStatement AuthnInstant="2019-05-25T09:01:56.183Z" SessionIndex="_c193236e-d958-4629-8adf-b2cb90e10c00">
      <AuthnContext>
        <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</AuthnContextClassRef>
      </AuthnContext>
    </AuthnStatement>
  </Assertion>
</samlp:Response>
```

パラメーターをチェックしてみます。

###### 署名

```xml
<SignatureValue>AXeD5TfWBl2xGkrPwuJCarm4skgRJpfxCNHzcZt1V6eHmjP8I1r12QwXnlAa9SRX8mSKJL4T93Rz9tEmw1vIHPUPz3ZSrw8soCfW8FMsi4zeXNtMiTWlUCuM/YpfUlSqgZaAayh0TGzNn/jARBtGCJb+oB2lBJhND2f6Rso9tceLwXTzOsm4jtO/KxEsPqW2Pj4gc77IggOskVR9KCfIweBdAAr6BZhyZ0vrEZ1fCbL93c2FGs+eAO/4VFIysydrpiH0rcgTlMIMmfSKYY4qk4iFOs/cwD6yVuISlydlCBrBlfZ4+A8tahj4ebnW712DfgIlzK06zzsZg7v4QR19NQ==</SignatureValue>
```

IdP-Initiated でも IdP (Azure AD) が署名をしていることが分かります。

###### 属性

```xml
    <AttributeStatement>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/tenantid">
        <AttributeValue>d6a725a7-fde0-4d2a-ab70-843f0d5bf595</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
        <AttributeValue>68d05d39-13f7-43c2-bb15-f98e84895472</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/displayname">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/identityprovider">
        <AttributeValue>https://sts.windows.net/d6a725a7-fde0-4d2a-ab70-843f0d5bf595/</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/claims/authnmethodsreferences">
        <AttributeValue>http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/ws/2008/06/identity/claims/role">
        <AttributeValue>arn:aws:iam::259358134580:role/shyamag014,arn:aws:iam::259358134580:saml-provider/shyamag014</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/Role">
        <AttributeValue>arn:aws:iam::259358134580:role/shyamag014,arn:aws:iam::259358134580:saml-provider/shyamag014</AttributeValue>
      </Attribute>
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration">
        <AttributeValue>900</AttributeValue>
      </Attribute>
    </AttributeStatement>
```

属性 (Attribute) は Azure AD が保持している、というのは SP-Initiated の動作でお伝えしたとおりです。
AWS のシングル サインオンの場合は少し特殊で 、「RoleSessionName」、「Role」、「SessionDuration」をユーザー属性として定義する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/73f3ac07-b9ba-b6b1-ce0b-5e0af4702673.png)

SAML Response の中身をみると、下記のとおり、定義した属性が含まれていることが分かりますね。

```xml
      <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName">
        <AttributeValue>test001@shyamag014.onmicrosoft.com</AttributeValue>
      </Attribute>
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/Role">
        <AttributeValue>arn:aws:iam::259358134580:role/shyamag014,arn:aws:iam::259358134580:saml-provider/shyamag014</AttributeValue>
      </Attribute>
      <Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration">
        <AttributeValue>900</AttributeValue>
```

#おわりに
今回は SAML 2.0 プロトコルの SP-Initiated と IdP-Initiated の動作の違いについて検証し、まとめました。
動作の違いは伝わりましたでしょうか。
また、個人的には、 IdP-Initiated でも IdP 自身が SAML Request を生成し、署名付きの SAML Response を生成している動作を確認できたことが収穫でした。
（どうして IdP-Initiated は SAML Request がないのに SAML Response を作れるのか…という謎が解けたので)

少しでも今回の Blog が参考になれば幸いです。