適用対象: 従業員テナント
外部テナント (詳細はこちら)
このチュートリアルでは、保護された Web API を .NET デーモン アプリから呼び出す方法について説明します。 クライアント デーモン アプリが独自の ID を使用してアクセス トークンを取得できるようにするには、Web API を呼び出します。 ここでは、保護された Microsoft Graph エンドポイントを呼び出します。
このチュートリアルでは、
- デーモン アプリがアプリ登録の詳細を使用するように構成します。 アプリに Microsoft Graph API の User.Read.All アクセス許可を付与していることを確認します。
- 独自の代わりにトークンを取得し、保護された Web API を呼び出すデーモン アプリを構築します。
前提条件
- .NET このチュートリアルでは、.NET 9.0 を使用します。
- Visual Studio Code または別のコードエディター。
-
テナント内のアプリ登録。 アプリの登録の詳細から次の情報があることを確認します。
- 登録したクライアント Web アプリのアプリケーション (クライアント) ID。
- Web アプリを登録した ディレクトリ (テナント) ID 。
- 作成した Web アプリのクライアント シークレットの値。
.NET デーモン アプリを作成する
ターミナルを開き、プロジェクトを公開するフォルダーに移動します。
.NET コンソール アプリを初期化し、そのルート フォルダーに移動します。
dotnet new console -n DotnetDaemon cd DotnetDaemon
パッケージをインストールする
Microsoft.Identity.Web
パッケージとMicrosoft.Identity.Web.DownstreamApi
パッケージをインストールします。
dotnet add package Microsoft.Identity.Web
dotnet add package Microsoft.Identity.Web.DownstreamApi
Microsoft.Identity.Web
では、ASP.NET Core、認証ミドルウェア、および .NET 用 Microsoft Authentication Library (MSAL) の間の接着が提供されるため、認証と承認の機能をアプリに簡単に追加できます。
Microsoft.Identity.Web.DownstreamApi
は、ダウンストリーム API の呼び出しに使用されるインターフェイスを提供します。
appsettings.json ファイルを作成して登録構成を追加する
アプリのルート フォルダーに appsettings.json ファイルを作成します。
アプリの登録の詳細を appsettings.json ファイルに追加します。
{ "AzureAd": { // "Authority": "", you can use this for customer tenants in place of Instance and TenantId values "Instance": "https://login.microsoftonline.com/", "TenantId": "Enter_the_Tenant_ID_Here", "ClientId": "Enter_the_Application_ID_Here", "ClientCredentials": [ { "SourceType": "ClientSecret", "ClientSecret": "Enter_the_Client_Secret_Here" } ] }, "DownstreamApi": { "BaseUrl": "https://graph.microsoft.com", "RelativePath": "/v1.0/users/", "RequestAppToken": true, "Scopes": [ "https://graph.microsoft.com/.default" ] } }
次の値は固有の値に置き換えてください。
価値 説明 Enter_the_Application_ID_Here 登録したクライアント デーモン アプリのアプリケーション (クライアント) ID。 Enter_the_Client_Secret_Here 作成したデーモン アプリのシークレット値。 Enter_the_Tenant_ID_Here アプリが登録されているディレクトリ/テナントのテナント ID。 注
外部テナントに登録されているアプリの場合は、 Authority を使用し、 Instance と TenantId の両方を削除できます。
"Authority": "https://<Enter_the_Tenant_Subdomain_Here>.ciamlogin.com/"
。 ここで、Enter_the_Tenant_Subdomain_Hereはテナントのサブドメインです。appsettings.json ファイルをプロジェクト ファイルに追加します。 プロジェクト ファイルは、プロジェクト内 の .csproj ファイルです。 これは、ファイルを出力ディレクトリにコピーする必要があるためです。
<ItemGroup> <None Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
アクセス トークンを取得する
コード エディターでprogram.cs ファイルを開き、その内容を削除します。
ファイルにパッケージを追加します。
using Microsoft.Extensions.DependencyInjection; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Web;
トークン取得インスタンスを作成します。 トークン取得インスタンスをビルドするには、
GetDefaultInstance
パッケージのTokenAcquirerFactory
クラスのMicrosoft.Identity.Web
メソッドを使用します。 既定では、インスタンスはアプリと同じフォルダーに存在する場合、 appsettings.json ファイルを読み取ります。GetDefaultInstance
サービス コレクションにサービスを追加することもできます。次のコード行をprogram.cs ファイル に 追加します。
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
構成から読み取るアプリケーション オプションを構成し、
DownstreamApi
サービスを追加します。DownstreamApi
サービスは、ダウンストリーム API の呼び出しに使用されるインターフェイスを提供します。 構成オブジェクトでは、このサービス DownstreamAPI を呼び出します。 デーモン アプリは、appsettings.jsonの DownstreamApi セクションからダウンストリーム API 構成 を 読み取ります。 既定では、メモリ内トークン キャッシュが取得されます。program.cs ファイルに次のコード スニペットを追加します。
const string ServiceName = "DownstreamApi"; tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName, tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
呼び出すダウンストリーム API は Microsoft Graph です。 このチュートリアルでは、
DownstreamApi
サービスを使用します。 Microsoft Graph SDK を使用することもできます。トークン取得機能を構築します。 これにより、追加したすべてのサービスが構成され、サービス プロバイダーが返されます。 このサービス プロバイダーを使用して、追加する API リソースにアクセスします。 この場合、アクセスするダウンストリーム サービスとして追加する API リソースは 1 つだけです。
program.cs ファイルに次のコード スニペットを追加します。
var serviceProvider = tokenAcquirerFactory.Build();
Web API を呼び出す
IDownstreamApi
インターフェイスを使用して、保護された Web API を呼び出すコードを追加します。 このチュートリアルでは、Microsoft Graph API エンドポイントを呼び出します。program.cs ファイルに次のコード を 追加します。
try { IDownstreamApi downstreamApi = serviceProvider.GetRequiredService<IDownstreamApi>(); var response = await downstreamApi.GetForAppAsync<HttpResponseMessage>("DownstreamApi"); var content = await response.Content.ReadAsStringAsync(); var statusCode = response.StatusCode; Console.WriteLine($"Response status code: {statusCode}"); if (!content.Any()) { Console.WriteLine("There are no users to display."); return; } Console.WriteLine(content); } catch (Exception ex) { Console.WriteLine("We could not retrieve the user's list: " + $"{ex}"); }
このコードは、 appsettings.json ファイルで定義したエンドポイントを呼び出します。 エンドポイントの呼び出しには、
GetForAppAsync
インターフェイスのIDownstreamApi
メソッドが使用されます。 アプリは、それ自体に代わって呼び出しを行います。 このメソッドは、HttpResponseMessage
オブジェクトを返します。 応答は文字列として読み取られ、コンソールに表示されます。
クライアント デーモン アプリを実行する
デーモン アプリのルート フォルダーに移動し、次のコマンドを実行します。
dotnet run
問題がなければ、ターミナルに 応答状態コード[OK] が表示されます。 ユーザーが存在する場合、ユーザーはターミナルに一覧表示されます。それ以外の場合 は、表示するユーザーがいないというメッセージが表示されます。
エラーが発生した場合は、ターミナルにエラー メッセージが表示されます。
トラブルシューティング
エラーが発生した場合は、
- appsettings.json ファイルに追加した登録の詳細を確認します。
- appsettings.json ファイルをプロジェクト ファイルに追加したことを確認します。
- アプリのアクセス許可が正しく構成されていることを確認します。