クイックスタート: コンソール アプリの ID を使用してトークンを取得し、Microsoft Graph API を呼び出す

ようこそ。 ご要望のページを表示できません。 問題の修正に取り組んでいますが、次のリンクから目的の記事にアクセスできるかお試しください。

クイック スタート: .NET コンソール アプリでトークンを取得し、Microsoft Graph を呼び出す

ご不便をおかけして申し訳ありませんが、問題が解決するまで今しばらくお待ちください。

以下のクイックスタートでは、コード サンプルを使って、.NET コンソール アプリケーションでアクセス トークンを取得して Microsoft Graph API を呼び出し、ディレクトリ内のユーザーの一覧を表示する方法を見ていただきます。 また、ユーザーの ID ではなく、アプリケーション ID を使ってジョブまたは Windows サービスを実行する方法も示します。 このクイックスタートのサンプル コンソール アプリケーションは、デーモン アプリケーションでもあるため、機密クライアント アプリケーションです。

前提条件

.NET 6.0 SDK の最小要件。

クイックスタート アプリをダウンロードして構成する

手順 1:Azure portal でのアプリケーションの構成

このクイックスタート内のサンプル コードを動作させるには、クライアント シークレットを作成し、Graph API の User.Read.All アプリケーション アクセス許可を追加します。

構成済みアプリケーションはこれらの属性で構成されています。

手順 2:Visual Studio プロジェクトをダウンロードする

Visual Studio 2022 を使ってプロジェクトを実行します。

ヒント

Windows におけるパスの長さの制限に起因したエラーを防ぐため、ドライブのルートに近いディレクトリをアーカイブの展開先またはリポジトリのクローン先とすることをお勧めします。

注意

Enter_the_Supported_Account_Info_Here

これでアプリケーションを実行すると、HTTP 403 - Forbidden* error: "Insufficient privileges to complete the operation が出力されます。 このエラーは、すべてのアプリ専用のアクセス許可には、アプリケーションに対してディレクトリの全体管理者による同意が必要であるために発生します。 ロールに応じて、次のオプションのいずれかを選択します。

グローバル テナント管理者

グローバル テナント管理者の場合は、[API のアクセス許可] ページに移動し、[Enter_the_Tenant_Name_Here に管理者の同意を与えます] を選びます。

標準ユーザー

テナントの標準ユーザーの場合は、アプリケーションに管理者の同意を与えるよう全体管理者に依頼してください。 これを行うには、次の URL を管理者に知らせます。

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

上記の URL を使ってアプリに同意を与えると、エラー AADSTS50011: No reply address is registered for the application が表示されることがあります。 このエラーが発生するのは、アプリケーションと URL にリダイレクト URI がないためです。 このメッセージは無視できます。

手順 4:アプリケーションの実行

Visual Studio で、F5 キーを押してアプリケーションを実行します。 それ以外の場合は、コマンド プロンプト、コンソール、またはターミナルを使用してアプリケーションを実行します。

cd {ProjectFolder}\1-Call-MSGraph\daemon-console
dotnet run

このコードでは:

  • {ProjectFolder} は、.zip ファイルを抽出したフォルダーです。 たとえば C:\Azure-Samples\active-directory-dotnetcore-daemon-v2 です。

結果として、Microsoft Entra ID のユーザーの一覧が表示されます。

このクイックスタート アプリケーションでは、クライアント シークレットを使用して、それ自体を機密クライアントとして識別します。 クライアント シークレットは、プロジェクト ファイルにプレーン テキスト ファイルとして追加されます。 セキュリティ上の理由により、アプリケーションを運用アプリケーションと見なす前に、クライアント シークレットではなく、証明書を使うことをお勧めします。 証明書の使用方法の詳細については、これらの手順を参照してください。

詳細情報

このセクションでは、ユーザーをサインインさせるために必要なコードの概要を示します。 この概要は、> コードのしくみ、主な引数、既存の .NET コンソール アプリケーションにサインインを追加する方法を理解するのに役立ちます。

このサンプルのしくみ

このクイックスタートで生成されたサンプル アプリの動作を示す図。

Microsoft.Identity.Web.GraphServiceClient

Microsoft Identity Web (Microsoft.Identity.Web.TokenAcquisition パッケージにあります) は、Microsoft ID プラットフォームによって保護された API にアクセスするためのトークンを要求するために使用されるライブラリです。 このクイックスタートでは、委任されたアクセス許可ではなく、アプリケーション自体の ID を使用してトークンを要求しています。 この場合の認証フローは、クライアント資格情報 OAuth フローと呼ばれます。 クライアント資格情報フローで MSAL.NET を使用する方法の詳細については、こちらの記事を参照してください。 このクイックスタートのデーモン アプリで Microsoft Graph を呼び出す場合は、Microsoft Graph に対する自動的に認証された要求を処理する (さらに、それ自体が Microsoft.Identity.Web.TokenAcquisition を参照する) Microsoft.Identity.Web.GraphServiceClient パッケージをインストールします。

Microsoft.Identity.Web.GraphServiceClient をインストールするには、Visual Studio のパッケージ マネージャー コンソールで次のコマンドを実行します。

dotnet add package Microsoft.Identity.Web.GraphServiceClient

アプリケーションの初期化

Microsoft.Identity.Web への参照を追加するには、次のコードを追加します。

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Graph;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;

次に、以下を使用してアプリを初期化します。

// Get the Token acquirer factory instance. By default it reads an appsettings.json
// file if it exists in the same folder as the app (make sure that the 
// "Copy to Output Directory" property of the appsettings.json file is "Copy if newer").
TokenAcquirerFactory tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();

// Configure the application options to be read from the configuration
// and add the services you need (Graph, token cache)
IServiceCollection services = tokenAcquirerFactory.Services;
services.AddMicrosoftGraph();
// By default, you get an in-memory token cache.
// For more token cache serialization options, see https://aka.ms/msal-net-token-cache-serialization

// Resolve the dependency injection.
var serviceProvider = tokenAcquirerFactory.Build();

このコードでは、appsettings.json ファイルで定義されている構成が使用されます。

{
   "AzureAd": {
       "Instance": "https://login.microsoftonline.com/",
       "TenantId": "[Enter here the tenantID or domain name for your Azure AD tenant]",
       "ClientId": "[Enter here the ClientId for your application]",
       "ClientCredentials": [
           {
              "SourceType": "ClientSecret",
              "ClientSecret": "[Enter here a client secret for your application]"
           }
       ]
   }
}
要素 説明
ClientSecret Azure portal でアプリケーション用に作成されたクライアント シークレット。
ClientId Azure portal に登録されているアプリケーションのアプリケーション (クライアント) ID。 この値は、Azure portal のアプリの [概要] ページで確認できます。
Instance (省略可能) セキュリティ トークン サービス (STS) では、アプリが認証するためのエンドポイントをインスタンス化することができます。 通常、パブリック クラウドでは https://login.microsoftonline.com/ になります。
TenantId テナントの名前またはテナント ID。

詳しくは、ConfidentialClientApplication のリファレンス ドキュメントをご覧ください。

Microsoft Graph の呼び出し

アプリの ID を使用してトークンを要求するには、AcquireTokenForClient メソッドを使用します。

GraphServiceClient graphServiceClient = serviceProvider.GetRequiredService<GraphServiceClient>();
var users = await graphServiceClient.Users
              .GetAsync(r => r.Options.WithAppOnly());

ヘルプとサポート

サポートが必要な場合、問題をレポートする場合、またはサポート オプションについて知りたい場合は、開発者向けのヘルプとサポートに関するページを参照してください。

次のステップ

デーモン アプリケーションの詳細については、シナリオの概要を参照してください。