Azure ADとのプロビジョニング（Salesforceプロファイルとユーザーロール）

# Azure ADのロール（概要）

- この記事でSalesforceとのプロビジョニングにおけるロールとプロファイルについて書いております。

類似の用語（1～3はSalesforceとのプロビジョニングには関係ないです。）

||用語|示すもの|本記事|
|---|---|---|---|---|
|1|Azure AD 固有のロール|Azure ADテナントでの役割、グループ管理者（全体管理者）、課金管理者、アプリケーション管理者、ユーザー管理者など|－|
|2|Azure ロール|Azure ADの管理グループでの役割、所有者、共同作成者、閲覧者など|－|
|3|Azure AD の組み込みロール|Azure ADのロールベースでのアクセス制御に関する種類の名称、組み込みロールとカスタムロールの2種類がある|－|
|4|（単に）ロール、ユーザーロール|Azure ADユーザーをSalesforceに割り当てるときに選択するロール、Salesforceではプロファイルにあたるもの|〇|


- 「ユーザーとグループの割り当て」を行う際、ロールを選択する必要があります。
- Salesforce標準プロファイルの英語名が初期セットされており、プロビジョニング設定前はどれを選択しても構いません。選択後に表示が「Default Access」に代わりますがSSOは可能になります。
- プロビジョニング設定を行うと、ロールにSalesforceプロファイルがインポートされます。
- プロビジョニング設定後、数時間経過しても初期セットのロールしか見えない場合は同期できていません。Salesforceのカスタムプロファイルが同期されいることを確認しましょう。

# ロールを選択する

Azure AD側の割り当て編集画面で、ユーザーやグループとロールを選択して対応付けると、そのプロファイルでSalesforceユーザーが作成されます。
![AzureAD割り当ての編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113270/4e296852-f693-f3bc-ed58-7dbacffac172.png)

※標準プロファイルでなくカスタムプロファイルを使う方が（Salesforceの設定上は何かと）おすすめです。

# 割り当て方

- ユーザー単位でロールに割り当てる

|Azure AD|ロール|-->|Salesforce|プロファイル|
|---|---|---|---|---|
|User A|システム管理者|-->|User A|システム管理者|
|User B<br>User C|標準ユーザー|-->|User B<br>User C|標準ユーザー|


- グループ単位でロールに割り当てる

Azure AD側にグループを作成します。

|Azure AD User|Azure AD Group|
|---|---|
|User A<br>User B|Group A|
|User C<br>User D|Group B|

グループをロールに割り当てます。

|Azure AD|ロール|-->|Salesforce|プロファイル|
|---|---|---|---|---|
|Group A|システム管理者|-->|User A<br>User B|システム管理者|
|Group B|標準ユーザー|-->|User C<br>User D|標準ユーザー|

※オンプレミスのADと接続している場合、ADのグループをロールに割り当てる管理も可能です。AD側でプロビジョニングをコントロールすることができます。

# ロールの初期状態（プロビジョニング設定前）

- 英語名の標準プロファイルが表示されます。
- カスタムプロファイルはまだインポートされていません。

![ロール（初期）_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113270/ed5538e9-51a3-f4d9-337d-b91db91baae7.jpeg)

# プロビジョニング設定後

- Salesforce組織にある標準プロファイルとカスタムプロファイルがインポートされます。
- 初期セットのプロファイルはグレーアウト（非活性化）され、代わりにインポートされたプロファイルが活性化されます。
    - System Administrator → システム管理者
    - Standard User → 標準ユーザ

![ロールを選択してください - Microsoft Azure_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113270/b6848472-b6fe-5841-0791-1d1e70549486.jpeg)

- 管理ユーザーの言語を英語にしている場合
    - プロビジョニングの管理者資格情報のSalesforceユーザーの言語が英語の場合、同期されるプロファイルも英語名になります。
    - 同じプロファイル名のまま活性化されます。

![ロール（英語）同期後_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113270/4a290075-c361-4047-9fd7-a3d6c7f39b0f.jpeg)

- インスタンスの中の情報（serviceprincipals の approles）を確認すると、日本語の場合は別のエントリとしてインポートされ、英語の場合は同じエントリのまま引き続き有効化されます。どちらの場合もSalesforceプロファイルは識別され、管理ユーザーの言語を変更しても問題ありません。
- 管理ユーザーの言語を英語にする必要はありません。日本語にしている方がわかりやすいです。


# いつまでたってもインポートされない場合

Salesforce **プロファイル名に重複** がある場合、インポートに失敗します。

管理ユーザーのパスワードやセキュリティートークンの再チェックは必要ですが、設定や資格情報が正しい場合はSalesforce側のプロファイル名を確認してください。

「プロビジョニング状態」をオンにして開始してから、結果がわかるまでAzure ADの処理が開始されるまで5分から10分程度です。一度処理されると次回は通常は40分間隔ですが、プロビジョニングの停止／開始、または再開をクリックすれば早く処理してくれます。

プロファイル名をユニークなものとして同期する仕組みがあり、重複している場合は連携できません。

- プロファイル名の重複について
    - カスタムプロファイルについては重複した名前では保存することができません。しかし、組織に最初からある標準プロファイルについては、同じ名前でコピーすることができてしまいます。（日本語名でも英語名でも同じ名前でコピー可能です） 
    - 同じ名前で作成するメリットは考えにくいですが、何かの拍子にうっかり同じ名前で作ってしまうとプロビジョニングの際に困ってしまいます。
- 解決方法
    - Salesforce側でプロファイル名をユニークにしてください。次回の同期処理でユニークになったプロファイルがインポートされます。
    - プロファイルのIDを調べて、Azure ADの属性マッピング機能を使ってプロビジョニングすることができましたが、重複を解消する方が簡単です。

- 初期セットされているロール

Salesforce側は組織によりデフォルトの標準プロファイルは異なりますが、Azure ADの初期セットに下記のものがありました。括弧内の日本語の標準プロファイルに対応します。

1. System Administrator（システム管理者）
1. Standard User（標準ユーザ）
1. Standard Platform User（標準 Platform ユーザ）
1. Solution Manager（ソリューション管理者）
1. Read only
1. msiam_access
1. Marketing User
1. Contract Manager
1. Chatter Moderator User
1. Chatter Free User
1. Chatter External User


# プロビジョニングログ（Azure AD）

- プロファイル名の重複エラー
 - number of duplicated entries
 - non-unique role names in the directory of import

|ログ|エラー内容|
|---|---|
|アクティビティの種類|Synchronization rule action|
|カテゴリ|ProvisioningManagement|
|状態の理由|Failed to process FakeServicePrincipal 'a1be97d7-98c1-4df4-be33-4577171841d9'; Error: All application roles must have unique Id, Name and Claim in Azure AD. Attempt to update application roles resulted in a number of duplicated entries and will be aborted. This is most commonly caused by having non-unique role names in the directory of import. Application roles with non-unique values: [Id: 6c0dc525-17aa-46f1-a249-3289f8f3fea8, Name: Minimum Access - Salesforce, Claim: ] [Id: 82afbe26-7c83-4925-becd-566848a55c5f, Name: Minimum Access - Salesforce, Claim: ] . This operation was retried 0 times. It will be retried again after this date: 2021-02-28T08:25:51.3649026Z UTC|


# 一番下のロールが選択できない

別の問題ですが、ロールの選択欄の下の方はスクロールしても選択できません。原因はAzure AD Portalの画面UIの問題です。Chrome、Firefox、Edgeブラウザのどれを使っても、また設定画面を英語に切り替えても選択できません。

- 解決方法
    - 簡単でした。ロール選択欄にある検索ボックスで絞り込めば選択できるようになります。

![ロールが選択できない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113270/ef1c1de6-e4ff-8d28-3dbb-972c7fcd13e0.png)



# Salesforce側で設定を変更したい場合

例えばプロビジョニング後にプロファイルを変更する場合、

- Azure AD側からロールを変更する
- Salesforce側の設定で変更する

この2通りがありますが、Salesforce側で変更したい場合、Azure ADの属性マッピングを編集してください。

- 属性の編集 ＞ このマッピングを適用する ＞ オブジェクトの作成中のみ

![属性の編集1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113270/132b8ed5-90dc-223f-a287-56479e42de4b.png)


デフォルトの「常時」の設定に設定していると、Azure ADの同期が実行されると（通常40分間隔）、差分として検知され上書きされます。


# ロールの確認方法（API）

Azure AD Portalの画面以外にGraph Explorer や PowerShell モジュールで設定情報の確認や、設定・更新・削除が可能です。

- Graph Explorer を使ってブラウザからのAPI実行する方法と、
- PowerShell モジュールを使ってコマンドで実行する方法

画面から必要な情報を確認できますが、APIやコマンドを使うのも便利です。


## Graph Explorer

ブラウザからMicrosoft Graph REST APIを使います。
https://developer.microsoft.com/ja-jp/graph/graph-explorer

ロールは approles で確認できます。{id} にはアプリケーションIDでなくオブジェクトIDを入れてください。

```
GET https://graph.microsoft.com/v1.0/serviceprincipals/{id}/approles
```

このようなレスポンスが返ってきます。

```
{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#servicePrincipals('0f749804-b569-40f2-b7a8-c80d88a47871')/appRoles",
    "value": [
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "System Administrator",
            "displayName": "System Administrator",
            "id": "d9f1142a-11a7-4370-a464-466e47e432b8",
            "isEnabled": true,
            "origin": "Application",
            "value": null
        },
```

## PowerShell モジュール

PowerShellはWinoddows環境、Linux環境にインストールして使うことができます。
Azure Active Directory PowerShell モジュールを追加してください。

- AzureAD (Azure Active Directory PowerShell for Graph)
- MSOnline (MSOnline PowerShell)

インストール方法
`Install-Module -Name AzureAD`
`Install-Module MSOnline`

AzureADモジュールは2つのバージョンがあり、どちらか選ぶ必要がありますが、今のところまだAzureADPreviewでなくてもよいと思います。

- AzureAD Module (Version 2.0)
- AzureADPreview Module (Version 2.0-preview)

ロールへのユーザーの割り当てコマンド
`Get-AzureADServicePrincipal`
`New-AzureADUserAppRoleAssignment`




## ドキュメント（参考）

- Microsoft Docs

本番組織とDeveloper組織、Sandbox用にそれぞれ手順があります。Sandboxの場合、**Sandbox用のエンタープライズアプリケーション**を選択してください。よく間違えてしまうところです。

- 本番組織、Developer組織の場合
 - チュートリアル:Azure Active Directory シングル サインオン (SSO) と Salesforce の統合 | Microsoft Docs https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/salesforce-tutorial
 - チュートリアル:Salesforce を構成し、Azure Active Directory を使用した自動ユーザー プロビジョニングに対応させる | Microsoft Docs https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/salesforce-provisioning-tutorial

- Sandboxの場合
 - チュートリアル:Azure Active Directory と Salesforce Sandbox の統合 | Microsoft Docs https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/salesforce-sandbox-tutorial
 - チュートリアル: Salesforce Sandbox を構成し、Azure Active Directory を使用した自動ユーザー プロビジョニングに対応させる | Microsoft Docs https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/salesforce-sandbox-provisioning-tutorial

- 一般的なトラブルシューティング
    - https://docs.microsoft.com/ja-jp/troubleshoot/azure/active-directory/troubleshoot-sign-in-saml-based-apps#misconfigured-application

- Salesforceのドキュメント、ヘルプ記事
    - シングルサインオン https://help.salesforce.com/s/articleView?id=sf.sso_about.htm&type=5
    - シングルサインオン実装ガイド https://developer.salesforce.com/docs/atlas.ja-jp.sso.meta/sso/sso_about.htm
    - シングルサインオン (Single Sign-On) ポイント集 https://help.salesforce.com/s/articleView?id=000315239&type=1
    - Salesforceの記事は応用範囲が広く、Azure ADとのSAMLベースのシングルサインオンだけであれば全部読み込まなくても大丈夫です。
    - Trailheadの「内部ユーザのシングルサインオンの設定 単元」https://trailhead.salesforce.com/ja/content/learn/modules/identity_login/identity_login_sso
        - こちらはAzure ADなどのIdP環境がなくても自習できるようにうまく作られていますが、はじめて取り組む場合には仕組みがわかりにくいかも知れません。
    - SCIM を使用した Salesforce ユーザ ID の管理 https://help.salesforce.com/s/articleView?id=sf.identity_scim_overview.htm&type=5

- PowerShell、API
    - Azure AD PowerShell overview | Microsoft Docs https://docs.microsoft.com/en-us/powershell/azure/active-directory/overview?view=azureadps-2.0
    - Install AzureAD PowerShell for Graph | Microsoft Docs https://docs.microsoft.com/en-us/powershell/azure/active-directory/install-adv2?view=azureadps-2.0
    - Microsoft Graph SDK - Microsoft Graph | Microsoft Docs https://docs.microsoft.com/ja-jp/graph/sdks/sdks-overview?view=graph-rest-1.0