📜

Microsoft Graph を使って Azure AD のアプリケーションのアクセス許可の一覧を取得する

2022/01/01に公開

はじめに

Microsoft Graph の beta バージョンでは Azure AD のサービス プリンシパルおよび OAuth2 のアクセス許可に対する操作が可能になっています。これにより、たとえば組織でどのアプリケーションがアクセス許可されているかを一覧で取得したり、アクセス許可の追加や削除を自動化することができるようになりました。今回は、組織のアプリケーションのアクセス許可の一覧を取得してみようと思います。

事前準備

Azure AD に新しいアプリケーションを登録します。Microsoft Graph に対して Directory.Read.All および User.Read.All アプリケーションのアクセス許可を付与します。

サンプル コード

https://github.com/karamem0/samples/tree/main/microsoft-graph-oauth2-permission-grants

実行手順

/oAuth2PermissionGrants のリクエストは ID しか返してくれないので、名前を取得するためには ID をキーに /servicePrincipals/{id}/users/{id} を呼び出す必要があります。

実行結果

実行すると以下のような感じで結果が表示されます。ユーザーとして同意している場合はユーザー情報が入っており、組織として同意している場合はユーザー情報が入りません。同じアプリケーションでもアクセス許可の付与先のリソース ID が違う場合は別のレコードとして取得されます。なお、クライアント ID やリソース ID はアプリケーション ID ではなくオブジェクト ID になるので、注意が必要です。Azure ポータルの エンタープライズ アプリケーション ではオブジェクト ID で検索することはできないので、その点はちょっと不便ですね。

ClientId     : eaa3382b-3519-4a6a-9e54-c659292ed5ac
ClientName   : SharePoint Service Module for PowerShell Core
ResourceId   : 11721932-6e2d-43bf-af73-81bb24705aa8
ResourceName : Office 365 SharePoint Online
UserId       :
UserName     :
Scope        : AllSites.FullControl TermStore.ReadWrite.All User.Read.All

ClientId     : eaa3382b-3519-4a6a-9e54-c659292ed5ac
ClientName   : SharePoint Service Module for PowerShell Core
ResourceId   : aa466d19-3e79-47c1-b3c1-a271b3ddbceb
ResourceName : Microsoft Graph
UserId       :
UserName     :
Scope        : offline_access

ClientId     : 40808e79-5e1e-4735-8aa8-2bd7bf361988
ClientName   : Graph explorer
ResourceId   : aa466d19-3e79-47c1-b3c1-a271b3ddbceb
ResourceName : Microsoft Graph
UserId       : 4b34f1e2-0c77-4fbd-a8cf-94a4606021ee
UserName     : Takashi Shinohara
Scope        : openid profile User.ReadWrite User.ReadBasic.All Sites.ReadWrite.All Contacts.ReadWrite People.Read Notes.ReadWrite.All Tasks.ReadWrite Mail.ReadWrite Files.ReadWrite.All Calendars.ReadWrite Directory.ReadWrite.All

おわりに

Power Automate の承認フローと組み合わせるとアクセス許可の同意を自動化できます。組織として同意するのはグローバル管理者でしかできない操作ですが、アプリケーションのアクセス許可であればユーザーに関係なく同意ができるはずなので、かなり便利にになるのではないかと思います。

Discussion