セキュリティで保護されたアプリからアプリとして Microsoft Graph にアクセスする
Azure App Service で実行されている Web アプリから Microsoft Graph にアクセスする方法について説明します。
Web アプリに代わって Microsoft Graph を呼び出すとします。 Web アプリにデータへのアクセスを提供するより安全な方法は、システム割り当てマネージド ID を使用することです。 Microsoft Entra ID のマネージド ID を使用すると、App Service は、アプリの資格情報を必要とせずに、ロールベースのアクセス制御 (RBAC) を使用してリソースにアクセスできます。 マネージド ID を対象の Web アプリに割り当てると、Azure では証明書の作成と配布が行われます。 シークレットまたはアプリの資格情報の管理について心配する必要はありません。
このチュートリアルでは、以下の内容を学習します。
- Web アプリ上でシステム割り当てマネージド ID を作成する。
- Microsoft Graph API のアクセス許可をマネージド ID に追加する。
- マネージド ID を使用して Web アプリから Microsoft Graph を呼び出す。
Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
前提条件
- App Service の認証および承認モジュールが有効になっている Azure App Service で実行されている Web アプリケーション。
アプリのマネージド ID を有効にする
Visual Studio を使用して Web アプリを作成して発行すると、アプリでマネージド ID が有効になります。 App Service で、左ペインの [ID] を選択し、 [システム割り当て済み] を選択します。 [状態] が [オン] に設定されていることを確認します。 そうでない場合は、 [保存] を選択し、 [はい] を選択して、システム割り当てマネージド ID を有効にします。 マネージド ID が有効になると、状態が [オン] に設定され、オブジェクト ID が使用可能になります。
[オブジェクト ID] の値をメモしておきます。これは、次の手順で必要になります。
Microsoft Graph へのアクセス権を付与する
Microsoft Graph にアクセスする場合、実行する操作に対する適切なアクセス許可がマネージド ID に与えられている必要があります。 現時点では、Microsoft Entra 管理センターを通してこのようなアクセス許可を割り当てるオプションはありません。 次のスクリプトを使用すると、要求された Microsoft Graph API のアクセス許可をマネージド ID サービス プリンシパル オブジェクトに追加できます。
# Install the module.
# Install-Module Microsoft.Graph -Scope CurrentUser
# The tenant ID
$TenantId = "aaaabbbb-0000-cccc-1111-dddd2222eeee"
# The name of your web app, which has a managed identity.
$webAppName = "SecureWebApp-20201106120003"
$resourceGroupName = "SecureWebApp-20201106120003ResourceGroup"
# The name of the app role that the managed identity should be assigned to.
$appRoleName = "User.Read.All"
# Get the web app's managed identity's object ID.
Connect-AzAccount -Tenant $TenantId
$managedIdentityObjectId = (Get-AzWebApp -ResourceGroupName $resourceGroupName -Name $webAppName).identity.principalid
Connect-MgGraph -TenantId $TenantId -Scopes 'Application.Read.All','AppRoleAssignment.ReadWrite.All'
# Get Microsoft Graph app's service principal and app role.
$serverApplicationName = "Microsoft Graph"
$serverServicePrincipal = (Get-MgServicePrincipal -Filter "DisplayName eq '$serverApplicationName'")
$serverServicePrincipalObjectId = $serverServicePrincipal.Id
$appRoleId = ($serverServicePrincipal.AppRoles | Where-Object {$_.Value -eq $appRoleName }).Id
# Assign the managed identity access to the app role.
New-MgServicePrincipalAppRoleAssignment `
-ServicePrincipalId $managedIdentityObjectId `
-PrincipalId $managedIdentityObjectId `
-ResourceId $serverServicePrincipalObjectId `
-AppRoleId $appRoleId
スクリプトを実行した後、Microsoft Entra 管理センターで、要求された API のアクセス許可がマネージド ID に割り当てられていることを確認できます。
[アプリケーション] に移動してから、[エンタープライズ アプリケーション] を選択します。 このペインには、テナント内のすべてのサービス プリンシパルが表示されます。 "アプリケーションの種類 == マネージド ID" のフィルターを追加し、マネージド ID のサービス プリンシパルを選択します。
このチュートリアルに従っている場合は、同じ表示名 (例: SecureWebApp2020094113531) の 2 つのサービス プリンシパルがあります。 "ホームページ URL" を持つサービス プリンシパルは、対象のテナント内の Web アプリを表します。 [マネージド ID] に表示されるサービス プリンシパルには、一覧にホームページ URL を含める必要は "ありません"。また、オブジェクト ID は、前の手順のマネージド ID のオブジェクト ID の値に一致する必要があります。
マネージド ID のサービス プリンシパルを選択します。
[概要] で [アクセス許可] を選択すると、Microsoft Graph に対する追加のアクセス許可が表示されます。
Microsoft Graph の呼び出し
ChainedTokenCredential クラス、ManagedIdentityCredential クラス、および EnvironmentCredential クラスは、Microsoft Graph に対する要求をコードで承認するためにトークン資格情報を取得する際に使用されます。 ChainedTokenCredential クラスのインスタンスを作成します。これにより、トークンを取得するために App Service 環境でのマネージド ID、または開発環境変数が使用され、そのトークンがサービス クライアントにアタッチされます。 次のコード例では、認証済みのトークン資格情報を取得し、それを使用して、グループ内のユーザーを取得するサービス クライアント オブジェクトを作成します。
このコードをサンプル アプリケーションの一部として見る場合は、GitHub 上のサンプルを参照してください。
Microsoft.Identity.Web.GraphServiceClient クライアント ライブラリ パッケージをインストールする
.NET コマンド ライン インターフェイス (CLI) または Visual Studio のパッケージ マネージャー コンソールを使って、Microsoft.Graph と Microsoft.Identity.Web.GraphServiceClient NuGet パッケージをプロジェクトにインストールします。
.NET CLI
コマンド ラインを開き、プロジェクト ファイルが含まれているディレクトリに切り替えます。
インストール コマンドを実行します。
dotnet add package Microsoft.Identity.Web.GraphServiceClient
dotnet add package Microsoft.Graph
パッケージ マネージャー コンソール
Visual Studio でプロジェクトまたはソリューションを開き、 [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] コマンドを使用してコンソールを開きます。
インストール コマンドを実行します。
Install-Package Microsoft.Identity.Web.GraphServiceClient
Install-Package Microsoft.Graph
例
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using Microsoft.Graph;
using Azure.Identity;
...
public IList<MSGraphUser> Users { get; set; }
public async Task OnGetAsync()
{
// Create the Graph service client with a ChainedTokenCredential which gets an access
// token using the available Managed Identity or environment variables if running
// in development.
var credential = new ChainedTokenCredential(
new ManagedIdentityCredential(),
new EnvironmentCredential());
string[] scopes = new[] { "https://graph.microsoft.com/.default" };
var graphServiceClient = new GraphServiceClient(
credential, scopes);
List<MSGraphUser> msGraphUsers = new List<MSGraphUser>();
try
{
//var users = await graphServiceClient.Users.Request().GetAsync();
var users = await graphServiceClient.Users.GetAsync();
foreach (var u in users.Value)
{
MSGraphUser user = new MSGraphUser();
user.userPrincipalName = u.UserPrincipalName;
user.displayName = u.DisplayName;
user.mail = u.Mail;
user.jobTitle = u.JobTitle;
msGraphUsers.Add(user);
}
}
catch (Exception ex)
{
string msg = ex.Message;
}
Users = msGraphUsers;
}
リソースをクリーンアップする
このチュートリアルを完了し、Web アプリや関連するリソースが不要になった場合は、作成したリソースをクリーンアップします。