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

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

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

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

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

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

Azure アカウントがない場合は、開始する前に free アカウントを作成します。

前提条件

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

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

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

  2. [状態][オン] に設定されていることを確認します。

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

  3. 次のセクションで必要な オブジェクト ID 値を書き留めます。

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

Microsoft Graphへのアクセスを許可する

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

  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」と入力します。

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

    このチュートリアルに従っている場合、同じ表示名を持つ 2 つのサービス プリンシパル (secureWebApp など) があります。 "ホームページ URL" を持つサービス プリンシパルは、対象のテナント内の Web アプリを表します。 マネージド ID に表示されるサービス プリンシパルには、ホーム ページ URL が一覧表示されておらずオブジェクト ID前のセクションのマネージド ID のオブジェクト ID 値と一致している必要があります。

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

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

  6. [ 概要] で、[ アクセス許可] を選択します。 Microsoft Graph の追加されたアクセス許可が表示されます。

    [アクセス許可] ウィンドウを示すスクリーンショット。

Microsoft Graph を呼び出す

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

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

  • GitHub

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

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

.NET Core コマンド ライン

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

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

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

Package Manager コンソール

Visual Studioでプロジェクト/ソリューションを開き、Tools>NuGet Package Manager>Package Manager Console コマンドを使用してコンソールを開きます。

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

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

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

  1. Azure portal で、Azure portal メニューから [リソース グループ] を選択し、App Service と App Service プランを含むリソース グループを選択します。

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

    リソース グループの削除を示すスクリーンショット。

  3. 確認するリソース グループの名前を入力します。

このプロセスの実行には数分かかる場合があります。

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

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

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