Azure AD のグループと Dataverse の所属部署を同期する
はじめに
Dataverse におけるセキュリティ モデル、つまり部署とチームの概念はなかなか難しいのですが、ざっくりとまとめると以下のようになります。
- ユーザーは必ず 1 つの部署に所属します。これはユーザーの所属部署列で表されます。所属部署列を設定すると、そのユーザーは部署の既定のチームに追加されます。この所属部署はレコードの所有権を判定するために使用されます。既定ではユーザーはルート部署に所属します。
- ユーザーは上記の他に複数のチームに所属できます。このチームは部署に対して追加できます。通常のチーム以外にも、Azure AD のグループと関連付けられる Azure AD グループ チームを作成することができます。この場合は、Azure AD のグループのメンバーを自動的に部署に含めることができます。
面倒なのはレコードの所有者との関連で、セキュリティ ロールの特権を 部署 や 部署配下 とした場合、レコードの所有者の所属部署と比較されます。既定ではユーザーはルート部署に所属するので、Azure AD グループ チームでアクセス許可を設定したとしても、意図した通りにアクセス許可が動作しないことがあります。残念ながらユーザーの所属部署 (つまり部署の既定のチーム) を Azure AD のグループと関連付ける手段は提供されていません。
ということで Azure AD のグループ Dataverse の所属部署を同期させたいとなった場合は、何らかの手段で作り込むことになります。コードを書くという方法もあるのですが、ここは Power Automate でやってみることにします。
実行手順
以下のように 営業部 という部署があるとします。
Azure AD にも 営業部 というグループを作成します。今回は必ず Microsoft 365 グループ である必要があります。
フローを作成します。全体像は以下のような感じです。トリガーには Office 365 Group の グループ メンバーが追加または削除されたとき を使用します。このトリガーは Microsoft 365 グループでしか使用できません。また削除されたときもフローが動いてしまうので条件で弾くようにします。
Azure AD のユーザー ID をキーにして Dataverse の systemuserid を取得します。
所属させる部署の businessunitid を取得します。
Dataverse Web API を呼び出して所属部署を変更します。
実行結果
実際に Azure AD グループにメンバーを追加してみます。
フローが実行されます。
メンバーの所属部署が変更されていることが確認できます。
おわりに
この方法だと、部署を作るごとにフローを増やさなければならないため、汎用的にやるのであれば Microsoft Graph の変更通知を使って HTTP トリガーを呼び出すようにする方法があるかと思います。
同期については標準で対応してほしいよなあと思うものの、Azure AD グループもきちんと管理できているのかというところもありますし、管理自体を部署に投げてしまうのが正しいありかたな気もするので、そんなものなのかなあと。どうしても Dynamics 365 の世界になってしまうので難しいですね。
Discussion