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

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

Diagram that shows accessing 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 無料アカウントを作成してください。

前提条件

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

Visual Studio を使用して Web アプリを作成して発行すると、アプリでマネージド ID が有効になります。

  1. App Service で、左ペインの [ID] を選択し、 [システム割り当て済み] を選択します。

  2. [状態][オン] に設定されていることを確認します。 そうでない場合は、 [保存] を選択し、 [はい] を選択して、システム割り当てマネージド ID を有効にします。 マネージド ID が有効になると、状態が [オン] に設定され、オブジェクト ID が使用可能になります。

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

Screenshot that shows the system-assigned identity.

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

Microsoft Graph にアクセスする場合、実行する操作に対する適切なアクセス許可がマネージド ID に与えられている必要があります。 現時点では、Microsoft Entra 管理センターを通してこのようなアクセス許可を割り当てるオプションはありません。

  1. 次のスクリプトを実行して、要求された 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
    
  2. スクリプトを実行した後、Microsoft Entra 管理センターで、要求された API のアクセス許可がマネージド ID に割り当てられていることを確認できます。

  3. [アプリケーション] に移動してから、[エンタープライズ アプリケーション] を選択します。 このペインには、テナント内のすべてのサービス プリンシパルが表示されます。 "アプリケーションの種類 == マネージド ID" のフィルターを追加し、マネージド ID のサービス プリンシパルを選びます。

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

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

    Screenshot that shows the All applications option.

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

    Screenshot that shows the Permissions pane.

Microsoft Graph の呼び出し

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

このコードをサンプル アプリケーションの一部として確認するには、次を参照してください。

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

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

.NET Core コマンド ライン

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

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

dotnet add package Microsoft.Identity.Web.MicrosoftGraph
dotnet add package Microsoft.Graph

パッケージ マネージャー コンソール

Visual Studio でプロジェクトまたはソリューションを開き、 [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] コマンドを使用してコンソールを開きます。

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

Install-Package Microsoft.Identity.Web.MicrosoftGraph
Install-Package Microsoft.Graph

.NET の例

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 アプリや関連するリソースが不要になった場合は、作成したリソースをクリーンアップします。

リソース グループを削除します

Azure portal で、ポータル メニューから [リソース グループ] を選択し、対象のアプリ サービスとアプリ サービス プランが含まれているリソース グループを選択します。

[リソース グループの削除] を選択して、リソース グループとすべてのリソースを削除します。

Screenshot that shows deleting the resource group.

このコマンドの実行には数分かかることがあります。

次の手順

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

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

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