SalesforceをAzureADでSSOする構成にしてみた

SalesforceをAzureADにSSOさせてみた。まだ課題はあるもののとりあえずは実現できたし、備忘録を兼ねて。


#シナリオ
すでにOffice365を利用しており、モバイルはIntuneとAzureADの条件付きアクセスで制御している。Salesforceでもモバイルからのアクセスは同じようにIntune管理下の端末で制御したい。

この２つを実現したい。
・SalesforceはOffice365とSSOさせたい
・条件付きアクセスでしっかりコントロールしたい
今回は、SSOをゴールにした。

#参考にしたもの
MicrosoftからもSalesforceからも手順は公開されている。

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

[Salesforce]Azure AD 認証プロバイダの設定
https://help.salesforce.com/articleView?id=sso_provider_azure.htm&type=5

公開されているドキュメントだし大丈夫だろうと高をくくっていたのだが、手順がそれぞれで結構違うし、とりあえずはMSのドキュメントを参考にしつつ進めた。（あとから、公開されているドキュメントも、環境によっては必ずしも正ではないことがあることをしるのだが・・・）

#事前にやっておいたこと
・Salesforceにカスタムドメイン（xxx.my.salesforce.com）を登録しておいた
・Salesforceにユーザーを作成すること。ユーザー名はOffice365のUPNにそろえておいた

#AzureADでの設定

1.[Azureポータル]→[Azure ActiveDirectry]→[エンタープライズアプリケーション]→[すべてのアプリケーション]→[新しいアプリケーション]

2.Salesforceを検索して、任意の名前を付けて、追加。

3.[エンタープライズアプリケーション]に戻り→先ほど追加したSalesforceを検索し→[シングルサインオン]→[SAML]

4.SAML設定を登録していく。
- １基本的なSAML構成の、[識別子(エンティティID)][サインオンURL]に、Salesforceのカスタムドメインを入力
- ２ユーザー属性とクレームは特に変更しない
- ３SAML署名証明書で[証明書（Base64）]をダウンロードしておく。
- ４Salesforceのセットアップは今は操作しない


MSの公開ドキュメントでは、[フェデレーションメタデータXML]とあるので、公開ドキュメント通りすすめたらSSO設定はうまくいったのだが、正常に動作せずしなかった。

結局上記の手順で全部作り直しした。正常に動作しなかったのは設定ミスがあったかもしれないが・・・。
  
#Salesforceでの設定
1.Salesforceを開き、歯車マーク→[サービスの設定]→[ID]→[シングルサインオン設定]
2.[SAMLを使用した統合シングルサインオン]→[編集]→[SAMLを有効化]にチェック→保存
3.[SAMLシングルサインオン構成]→[新規]から設定を入れる

|項目||
|:-----------------|:------------------|
|名前|任意の名前。Office365とか。入力するとAPI参照名も同じになる。|
|発行者|先のAzureADのSAML設定画面の[AzureAD識別子]の値をペースト|
|エンティティID|salesforceのカスタムドメイン名。https://xxx.my.salesforce.comとか|
|発行者|AzureADのSAML設定画面の[AzureAD識別子]の値をペースト|
|IDプロバイダの証明書|さっきダウンロードしたBase64証明書をアップロード|
|SAML ID種別|[アサーションには、ユーザーのSalesforceユーザー名が含まれます]|
|SAML IDの場所|[IDはSubjectステートメントのNameIdentifinder要素にあります]|
|サービスプロバイダの起動要求バインド|[HTTPポスト]|
|IDプロバイダのログインURL|先のAzureADのSAML設定画面の[ログインURL]の値をペースト|
|カスタムログアウトURL|先のAzureADのSAML設定画面の[ログアウトURL]の値をペースト|
4.保存する

5.サイドメニュー→[会社の設定]→[サイトおよびドメイン]→[私のドメイン]→[認証設定]
6.[認証サービス]に先ほど登録した名前（上記だとOffice365）があるので、チェックし、保存。

[SAML ID種別]について、AzureADの自動プロビジョニングを有効にしていれば設定が違うかもしれないが、すでにSalesforce上にユーザーを作成しているので[統合IDが含まれます]ではなく[Salesforceユーザー名が含まれます]を選択したとこと、うまくいった。


#もう一度AzureADの設定
- 先のAzureADのSAML設定の画面→[ユーザーとグループ]から、ユーザーを追加する。ユーザーを選択し、Salesforceの権限を設定して保存。
- [AzureActive Directry]→[エンタープライズアプリケーション]→[条件付きアクセス]から、条件付きアクセスポリシーに今回作成しているSalesforceを登録する。


#テスト
テストした。

1回目の設定では、カスタムドメイン開いて、365の認証画面にリダイレクトされ、AzureADは認証されるが、「このアプリはAAD Graphに権限がないよ！」と表示されてしまった。アプリ名に半角（）入れてるためか、XMLでうまくいかないとか、にっちもさっちもいかず・・・。結局作り直しした。

2回目の設定では、カスタムドメイン開いて、365の認証画面にリダイレクトされ、AzureADは認証され、Salesforceにリダイレクトされるのだが、Salesforce側ではじかれてしまった。
エラーメッセージは「ログインできません！アサーションかログイン履歴見てね」なのだけど、Salesforceのログイン履歴にも出てこない。Salesforceユーザーは個別作成しているからか？ひょっとしてこれかなー、というところでSAMLID種別を変更したところ、解決した。


#トラブルシュートで参考にしたもの

@uekikazuki  さんのSalesforce(sandbox)にAzure ADでSingleSignonする
https://qiita.com/uekikazuki/items/ce1f0fcc73c4ccbc0e45

うしがみさん　Azure AD でシングル サインオン！！　～フェデレーション編～
https://www.cloudou.net/azure-active-directory/aad003/

公開ドキュメントではないが、AzureADの上記のSAML設定画面の中にある「ステップ　バイ　ステップの手順を表示」(英語）

#感想
・意外と簡単。もっとハードル高いかと思っていた。
・これならほかのSaaSでもいけるんじゃないか。

・公式ドキュメントを全部丸のみしてはいけない。（でも、条件次第では正しい。やった後ならある程度わかる）
・AzureサポートもSalesforceサポートも、ある程度答えてくれるが、相手の設定によるところは答えてくれない。（サポートでは、当然答えられない）

・条件付きアクセスで、アクセス元アプリをきちんと制御できるか、続けて要検証。（できる！という情報はある）
・Salesforceコンプライアンスポリシーの制御の設定をきちんとできるか、要絵検証。（できる！という情報はある）


ほかのSaaSもいくつかまとめてみました。[各種SaaSとAzure Active Directoryのシングルサインオン対応状況を調べてみた](https://qiita.com/hisssa0102/items/77f94823f6c708623694)を参照してください。