次の方法で共有


チュートリアル: .NET デーモン アプリから保護された Web API を呼び出す

適用対象: 白いチェック マーク記号が付いた緑の円。 従業員テナント 白いチェック マーク記号が付いた緑の円。 外部テナント (詳細はこちら)

このチュートリアルでは、保護された 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 デーモン アプリを作成する

  1. ターミナルを開き、プロジェクトを公開するフォルダーに移動します。

  2. .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 ファイルを作成して登録構成を追加する

  1. アプリのルート フォルダーに appsettings.json ファイルを作成します。

  2. アプリの登録の詳細を 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 を使用し、 InstanceTenantId の両方を削除できます。

    "Authority": "https://<Enter_the_Tenant_Subdomain_Here>.ciamlogin.com/"ここで、Enter_the_Tenant_Subdomain_Hereはテナントのサブドメインです。

  3. appsettings.json ファイルをプロジェクト ファイルに追加します。 プロジェクト ファイルは、プロジェクト内 の .csproj ファイルです。 これは、ファイルを出力ディレクトリにコピーする必要があるためです。

    <ItemGroup>
        <None Update="appsettings.json">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>
    

アクセス トークンを取得する

  1. コード エディターでprogram.cs ファイルを開き、その内容を削除します。

  2. ファイルにパッケージを追加します。

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    
  3. トークン取得インスタンスを作成します。 トークン取得インスタンスをビルドするには、GetDefaultInstance パッケージのTokenAcquirerFactory クラスのMicrosoft.Identity.Web メソッドを使用します。 既定では、インスタンスはアプリと同じフォルダーに存在する場合、 appsettings.json ファイルを読み取ります。 GetDefaultInstance サービス コレクションにサービスを追加することもできます。

    次のコード行をprogram.cs ファイル 追加します。

    var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
    
  4. 構成から読み取るアプリケーション オプションを構成し、 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 を使用することもできます。

  5. トークン取得機能を構築します。 これにより、追加したすべてのサービスが構成され、サービス プロバイダーが返されます。 このサービス プロバイダーを使用して、追加する API リソースにアクセスします。 この場合、アクセスするダウンストリーム サービスとして追加する API リソースは 1 つだけです。

    program.cs ファイルに次のコード スニペットを追加します。

    var serviceProvider = tokenAcquirerFactory.Build();
    

Web API を呼び出す

  1. IDownstreamApi インターフェイスを使用して、保護された Web API を呼び出すコードを追加します。 このチュートリアルでは、Microsoft Graph API エンドポイントを呼び出します。

  2. 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 ファイルをプロジェクト ファイルに追加したことを確認します。
  • アプリのアクセス許可が正しく構成されていることを確認します。