チュートリアル:セキュリティで保護されたアプリからアプリとして Microsoft Graph にアクセスする

Azure App Service で実行されている Web アプリから Microsoft Graph にアクセスする方法について説明します。

Microsoft Graph へのアクセスを示す図

Web アプリに代わって Microsoft Graph を呼び出すとします。 Web アプリにデータへのアクセスを提供するより安全な方法は、システム割り当てマネージド ID を使用することです。 Azure Active Directory のマネージド ID を使用すると、App Service は、アプリの資格情報を必要とせずに、ロールベースのアクセス制御 (RBAC) を使用してリソースにアクセスできます。 マネージド ID を対象の Web アプリに割り当てると、Azure では証明書の作成と配布が行われます。 シークレットまたはアプリの資格情報の管理について心配する必要はありません。

このチュートリアルでは、以下の内容を学習します。

  • Web アプリ上でシステム割り当てマネージド ID を作成する。
  • Microsoft Graph API のアクセス許可をマネージド ID に追加する。
  • マネージド ID を使用して Web アプリから Microsoft Graph を呼び出す。

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

前提条件

アプリのマネージド ID を有効にする

Visual Studio を使用して Web アプリを作成して発行すると、アプリでマネージド ID が有効になります。 App Service で、左ペインの [ID] を選択し、 [システム割り当て済み] を選択します。 [状態][オン] に設定されていることを確認します。 そうでない場合は、 [保存] を選択し、 [はい] を選択して、システム割り当てマネージド ID を有効にします。 マネージド ID が有効になると、状態が [オン] に設定され、オブジェクト ID が使用可能になります。

[オブジェクト ID] の値をメモしておきます。これは、次の手順で必要になります。

システム割り当て ID を示すスクリーンショット。

Microsoft Graph へのアクセス権を付与する

Microsoft Graph にアクセスする場合、実行する操作に対する適切なアクセス許可がマネージド ID に与えられている必要があります。 現時点では、Azure portal でこのようなアクセス許可を割り当てるオプションはありません。 次のスクリプトを使用すると、要求された Microsoft Graph API のアクセス許可をマネージド ID サービス プリンシパル オブジェクトに追加できます。

# Install the module. (You need admin on the machine.)
# Install-Module AzureAD.

# Your tenant ID (in the Azure portal, under Azure Active Directory > Overview).
$TenantID="<tenant-id>"
$resourceGroup = "securewebappresourcegroup"
$webAppName="SecureWebApp-20201102125811"

# Get the ID of the managed identity for the web app.
$spID = (Get-AzWebApp -ResourceGroupName $resourceGroup -Name $webAppName).identity.principalid

# Check the Microsoft Graph documentation for the permission you need for the operation.
$PermissionName = "User.Read.All"

Connect-AzureAD -TenantId $TenantID

# Get the service principal for Microsoft Graph.
# First result should be AppId 00000003-0000-0000-c000-000000000000
$GraphServicePrincipal = Get-AzureADServicePrincipal -SearchString "Microsoft Graph" | Select-Object -first 1

# Assign permissions to the managed identity service principal.
$AppRole = $GraphServicePrincipal.AppRoles | `
Where-Object {$_.Value -eq $PermissionName -and $_.AllowedMemberTypes -contains "Application"}

New-AzureAdServiceAppRoleAssignment -ObjectId $spID -PrincipalId $spID `
-ResourceId $GraphServicePrincipal.ObjectId -Id $AppRole.Id

スクリプトを実行した後、Azure portal で、要求された API のアクセス許可がマネージド ID に割り当てられていることを確認できます。

[Azure Active Directory] に移動し、 [エンタープライズ アプリケーション] を選択します。 このペインには、テナント内のすべてのサービス プリンシパルが表示されます。 [すべてのアプリケーション] で、マネージド ID のサービス プリンシパルを選択します。

このチュートリアルに従っている場合は、同じ表示名 (例: SecureWebApp2020094113531) の 2 つのサービス プリンシパルがあります。 "ホームページ URL" を持つサービス プリンシパルは、対象のテナント内の Web アプリを表します。 ホームページ URL のないサービス プリンシパルは、Web アプリのシステム割り当てマネージド ID を表します。 マネージド ID の [オブジェクト ID] の値は、以前に作成したマネージド ID のオブジェクト ID と一致します。

マネージド ID のサービス プリンシパルを選択します。

[すべてのアプリケーション] オプションを示すスクリーンショット。

[概要][アクセス許可] を選択すると、Microsoft Graph に対する追加のアクセス許可が表示されます。

[アクセス許可] ペインを示すスクリーンショット。

Microsoft Graph を呼び出す (.NET)

DefaultAzureCredential クラスは、Microsoft Graph に対する要求をコードで承認するためにトークン資格情報を取得する際に使用されます。 DefaultAzureCredential クラスのインスタンスを作成します。これは、マネージド ID を使用し、トークンを取得してサービス クライアントにアタッチします。 次のコード例では、認証済みのトークン資格情報を取得し、それを使用して、グループ内のユーザーを取得するサービス クライアント オブジェクトを作成します。

このコードをサンプル アプリケーションの一部として見る場合は、GitHub 上のサンプルを参照してください。

Microsoft.Identity.Web.MicrosoftGraph クライアント ライブラリ パッケージをインストールする

.NET Core コマンド ライン インターフェイスまたは Visual Studio のパッケージ マネージャー コンソールを使用して、Microsoft.Identity.Web.MicrosoftGraph NuGet パッケージをプロジェクトにインストールします。

コマンド ラインを開き、プロジェクト ファイルが含まれているディレクトリに切り替えます。

インストール コマンドを実行します。

dotnet add package Microsoft.Identity.Web.MicrosoftGraph

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Azure.Identity;
using Microsoft.Graph.Core;
using System.Net.Http.Headers;

...

public IList<MSGraphUser> Users { get; set; }

public async Task OnGetAsync()
{
    // Create the Microsoft Graph service client with a DefaultAzureCredential class, which gets an access token by using the available Managed Identity.
    var credential = new DefaultAzureCredential();
    var token = credential.GetToken(
        new Azure.Core.TokenRequestContext(
            new[] { "https://graph.microsoft.com/.default" }));

    var accessToken = token.Token;
    var graphServiceClient = new GraphServiceClient(
        new DelegateAuthenticationProvider((requestMessage) =>
        {
            requestMessage
            .Headers
            .Authorization = new AuthenticationHeaderValue("bearer", accessToken);

            return Task.CompletedTask;
        }));

    List<MSGraphUser> msGraphUsers = new List<MSGraphUser>();
    try
    {
        var users =await graphServiceClient.Users.Request().GetAsync();
        foreach(var u in users)
        {
            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 アプリや関連するリソースが不要になった場合は、作成したリソースをクリーンアップします。

次の手順

このチュートリアルでは、以下の内容を学習しました。

  • Web アプリ上でシステム割り当てマネージド ID を作成する。
  • Microsoft Graph API のアクセス許可をマネージド ID に追加する。
  • マネージド ID を使用して Web アプリから Microsoft Graph を呼び出す。

.NET Core アプリPython アプリJava アプリ、または Node.js アプリをデータベースに接続する方法について学習します。