Azure AD とエンタープライズ アプリケーションを SAML 連携する際のトラブルシュートのやり方について

#はじめに

Azure AD にアプリケーションを登録し、SAML 連携することで、Azure AD ユーザーから SAML 連携したアプリケーションにシングル サインオンできるようになります。
また、ギャラリー内のエンタープライズ アプリケーションの場合は、下記 Microsoft 公開情報に、チュートリアルとして Azure AD 側、アプリケーション側それぞれの設定方法が画面ショット付きで記載されております。

-参考情報
SaaS アプリケーションと Azure Active Directory の統合に関するチュートリアル
URL:https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/tutorial-list

しかしながら実際にチュートリアルとおりに設定してもエラーが出てしまい、シングル サインオンに失敗してしまう、というお問い合わせは多くいただきます。
今回は、 Salesforce を例によくある例と、Fiddler を使ったトラブルシュートのやり方をご紹介します。

# 前提
今回は、下記チュートリアルを使い、 Salesforce をエンタープライズ アプリケーションから登録し、一連の設定を行っている状況です。

-参考情報
チュートリアル:Azure Active Directory と Salesforce の統合
URL:https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/salesforce-tutorial

#やってみる

ほぼすべてのチュートリアルに記載されていますが、シングル サインオンの構成をひととおり行ったあとは、エンタープライズ アプリケーションの「Test」を行うように記載されています。実際にやってみましょう。

1. Azure ポータルにサインインします。
2. 左ペインより Azure Active Directory をクリックします。
3. 概要画面より、エンタープライズ アプリケーションをクリックします。
4. すべてのアプリケーションより、「Salesforce」をクリックします。
5. 概要画面より、「シングル サインオン」をクリックします。
SAML ベースのサインオン画面より、下記画面ショットにある「このアプリケーションをTest」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/e03132e8-e497-ca6b-fa61-26c1aeef0f8f.png)

現在のユーザーとしてサインインをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/ae242257-b57c-869b-edb8-a3a57bd12772.png)

アカウントを選択する画面で、現在のユーザーを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/50e4e761-a30a-86d1-2a70-d90e45e513c3.png)

すると下記画面ショットのとおり、エラーが出力されました。
初めてこのエラー画面を見ると正直面食らってしまうかもしれません。実際私もそうでした。
まずやるべきことは、エラーコードで検索してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/32b6fabb-fe16-f23e-822b-99d9aaad11ba.png)

すると、下記 Microsoft 公開情報にエラーコードに該当するエラー内容が記載されていることが分かります。

-参考情報

フェデレーション シングル サインオン用に構成されたギャラリー アプリケーションへのサインインに関する問題
 アプリケーションが正しく構成されていない
URL:https://docs.microsoft.com/ja-jp/azure/active-directory/manage-apps/application-sign-in-problem-federated-sso-gallery#misconfigured-application

>エラー AADSTS650056:アプリケーションが正しく構成されていないこの場合は、次のいずれかの原因が考えられます。クライアントは、クライアントのアプリケーション登録の要求されたアクセス許可に "AAD グラフ" のアクセス許可を記載していません。あるいは、管理者がテナントで同意していません。あるいは、要求のアプリケーション識別子を見て、構成したクライアント アプリケーション識別子に一致することを確認してください。構成を修正するか、テナントの代わりに同意するように管理者に連絡してください。

考えられる原因
**SAML 要求でアプリケーションから Azure AD に送信された Issuer 属性が、Azure AD でアプリケーションに対して構成された識別子の値に一致していません。**

色々書いてありますが、端的に書いてしまうと、アプリケーション側から要求されている Issuer 属性(識別子) と Azure AD 側で設定している識別子が一致していないためにエラーになっていると記載されています。

もう少しこのあたりの動きを見てみましょう。
下記 Microsoft の公開情報に記載されていますが、アプリケーション側が発行する Issuer (アプリケーション側が発行する一意の ID) と Azure AD 側のシングル サインオンで設定している識別子は**必ず一致させる必要があります。**

-参考情報
発行者
URL:https://docs.microsoft.com/ja-jp/azure/active-directory/develop/single-sign-on-saml-protocol#issuer

>AuthnRequest の Issuer 要素は、Azure AD でのクラウド サービスの ServicePrincipalNames のいずれかと厳密に一致する必要があります。 通常、これはアプリケーション登録時に指定される App ID URI に設定されます。

下記が Issuer 要素が記載された SAML Request の中身の例です。

```xml

<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://www.contoso.com</Issuer>
```

では、実際に、アプリケーション側がどのような Issuer 要素を要求しているかどうかを確認してみましょう。
Salesforce の場合は、「設定」→「ID」→「シングル サインオン設定」の順にクリックすると、シングル サインオン構成の画面の右下に「エンティティ ID」を確認できます。これがアプリケーション側が発行する Issuer ID になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/a4d63f48-ced9-5d49-e59d-b11368966a7e.png)

Salesforce の場合は上記のとおりエンティティ ID を簡単に確認できますが、Fiddler を使って HTTPS 通信をキャプチャすることで、実際にアプリケーション側が要求している Issuer ID を確認することができます。
(アプリケーションによっては、Issuer 要求をアプリケーション側の設定画面からは確認できない場合もあります。)

Fiddler の入手と取得方法は下記記事を参考にしてください。

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

Fiddler を起動し、「Captuer Traffice」を有効にした状態で、SAML ベースのサインオン画面より、下記画面ショットにある「このアプリケーションをTest」から「現在のユーザーとしてサインイン」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/c6671483-a06a-201f-7cb5-2d2687a7fefb.png)

サインインするアカウントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/c566380c-f39e-60b7-a87a-1ba6680ebed8.png)

エラーを再現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/ae5474dc-1b9b-d838-b249-0b461f22a551.png)

取得した Fiddler の中で確認するパケットは「SAML Request」になります。
SAML Request が Azure AD に対して渡す AuthnReauest(認証要求) になります。
Azure AD は SAML Request の内容に応じて、アプリケーション側に SAML Response を返すというのが基本的な SAML プロトコルの通信フローになります。

Fiddler の中で SAML Request を見つけたら右クリックし、「Send to TexWizard」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/477d8911-1d59-ff87-5cd9-eccb9fabf486.png)

ポップアップ表示されたデコードされた SAML Request の中で transform を「From DeflatedSAML」を選択すると、下記のとおり、XML フォーマットで SAML Request の中身を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/05cfaa45-4858-a2f8-d31c-90aa85930e20.png)

下記が整形した SAML Request の中身です。

```xml

<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL="https://shyamag018.my.salesforce.com" Destination="https://login.microsoftonline.com/a96567f1-ec44-4e81-b298-8bad9430c5b3/saml2" ID="_2CAAAAW0LZluVME8wMnYwMDAwMDA4T0k2AAAA3Ekdd4ZdAtspQXrWJZPU3_x0H5rfpVdwQVL0W2MfUR7kZJzGPuwfvOVUoJdEUYqPOJxukvHrUDj6hh1rv5r7ULBW1M-9q_k1TjFiZFEmOT58cHfoyctpqPRXRCVIvMlZcQZhQRctNJCPtKYlA5GHrVsoH4rfG-fxic0N1cAvo0DZRczdnQ2GTli1BmTtHaS68JSLADAnFiWnUs0uBkNZ1vCZwYWSFrLCDnaiV9wZrXkfguNqQ5j5GOOxnWJ95146_g" IssueInstant="2019-08-10T11:05:20.613Z" 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://shyamag018.my.salesforce.com</saml:Issuer>
</samlp:AuthnRequest>
```

更に細分化して Issuer 要素だけが書かれた行が下記です。

```xml

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

Salesforce アプリケーションが要求している、Issuer 要素が「**https://shyamag018.my.salesforce.com**」であることが確認できました。

この値を Azure AD 側の識別子の値を一致させる必要がありますので、Azure AD 側の設定を見てみましょう。

基本的な SAML 構成の識別子の値を見てみると、「https://shyamag018.my.salesforce.com」 ではなく、「https://shyamag017.my.salesforce.com」 になっていることがわかります。値を変更しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/a3eddf00-8c96-c17f-9c6d-509bc267b497.png)

「https://shyamag018.my.salesforce.com」 に変更し、「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/1f0d0a5c-d2dc-3cc4-e606-f6438e92b1a1.png)

正常に保存されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/06bc46e6-f8b6-52ed-9322-59a3326f887b.png)

この状態で再度「このアプリケーションをTest」をクリックして、接続テストをしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/f1f32dd4-4d11-ae48-25f4-f014a0f4edae.png)

「現在のユーザーとしてサインイン」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/539ffaec-6b5a-e64a-a89f-ef11d21aad31.png)

サインインするアカウントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/d19840ed-1cda-f5a3-c161-e3928d36d5b5.png)

今度は今までと違うエラーメッセージが出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/ecfd05c4-41a7-ea40-234b-852b9d5e1b8a.png)

このメッセージは見ていただくだけで分かる方もいらっしゃるかもしれませんが、念のためドキュメントを確認してみましょう。

ユーザーにロールが割り当てられていない
URL:https://docs.microsoft.com/ja-jp/azure/active-directory/manage-apps/application-sign-in-problem-federated-sso-gallery#user-not-assigned-a-role

>エラー AADSTS50105:サインイン ユーザー "brian@contoso.com" はアプリケーションのロールに割り当てられていません。
考えられる原因
このユーザーは、Azure AD 内のアプリケーションへのアクセスを許可されていません。

内容は実にシンプルで、エンタープライズ アプリケーションの「ユーザーとグループ」に対象のユーザー「shyamag@shyamag018.onmicrosoft.com」が割り当てられていないためです。

対象のユーザーを割り当てる手順は下記のとおりです。
「ユーザーとグループ」より画面上部の「＋ユーザーの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/26888f7d-c126-6b57-db4e-9c362118effd.png)

ユーザーとグループより対象のユーザーを選択し、「選択」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/54b8804a-6e89-ace6-7d30-a5605ff524c4.png)

ロールの選択より任意のロールを選択し、「選択」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/6b93888c-4013-87a7-45df-ba9fe015de04.png)

ユーザーとロールを割り当てたら「割り当て」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/af61703d-2ac9-fd30-1d5d-73b55e38bc4d.png)

割り当てが成功したことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/3a61d6c2-3fbf-da33-e244-b86dbb335d6c.png)

再度テスト画面より、「現在のユーザーとしてサインイン」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/c246de7d-7eea-a3f4-e2e0-765177ede598.png)

対象のユーザーを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/3b5139e3-54da-3a28-e9bc-e764fcd32c8f.png)

無事当該のユーザーで対象の Salesforce にシングル サインオンすることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/e59784e6-476c-aa49-dc4e-5a5f8c192461.png)

#おわりに

冒頭にも触れましたが、チュートリアルとおりに設定してもエラーが出てしまい、シングル サインオンに失敗してしまう、というお問い合わせは多くいただきます。実際にお問い合わせをいただいている中で一番多いのがこの Issuer 要素(識別子の値) の不一致になります。

今回は、テスト接続の際に実際にエラーを発生させ、エラーの原因の特定と、 Fiddler を使ってアプリケーション側が要求する Issuer 要素の確認、 Azure AD 側の設定の確認、修正、シングル サインオンの成功までのトラブルシュートのやり方をご案内しました。

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