Web API を呼び出すデーモン アプリを構成する方法

Web API を呼び出すデーモン アプリケーションのコードを構成する方法について説明します。

デーモン アプリをサポートしている Microsoft ライブラリ

次の Microsoft ライブラリはデーモン アプリをサポートしています。

言語/フレームワーク プロジェクト
GitHub
Package 取得
started
ユーザーのサインイン Web API へのアクセス 一般提供 (GA) または
パブリック プレビュー1
.NET MSAL.NET Microsoft.Identity.Client クイックスタート ライブラリでは、ユーザー サインインの ID トークンを要求できません。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA
Java MSAL4J msal4j ライブラリでは、ユーザー サインインの ID トークンを要求できません。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA
Node MSAL Node msal-node クイックスタート ライブラリでは、ユーザー サインインの ID トークンを要求できません。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA
Python MSAL Python msal-python クイックスタート ライブラリでは、ユーザー サインインの ID トークンを要求できません。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA

1オンライン サービスのユニバーサル ライセンス条項は、パブリック プレビューのライブラリに適用されます。

機関を構成する

デーモン アプリケーションでは、委任されたアクセス許可ではなく、アプリケーションのアクセス許可が使用されます。 そのため、サポートされているアカウントの種類を、組織のディレクトリ内のアカウントまたは個人用 Microsoft アカウント (例: Skype、Xbox、Outlook.com) にすることはできません。 Microsoft の個人アカウントの場合、デーモン アプリケーションに同意を付与するテナント管理者はいません。 "自分の所属組織のアカウント" または "任意の組織のアカウント" を選択する必要があります。

アプリケーション構成に指定された機関は、(組織に関連付けられたテナント ID またはドメイン名を指定して) テナント化する必要があります。

マルチテナント ツールを提供する場合でも、テナント ID またはドメイン名を使用する必要があります。このフローでは commonorganizations は使用しません。どのテナントを使用する必要があるかをサービスで確実に推測できないためです。

アプリケーションを構成してインスタンス化する

MSAL ライブラリでは、クライアントの資格情報 (シークレットまたは証明書) は、機密クライアント アプリケーション構築のパラメーターとして渡されます。

重要

アプリケーションが、サービスとして実行されているコンソール アプリケーションであっても、それがデーモン アプリケーションの場合は、機密クライアント アプリケーションである必要があります。

構成ファイル

構成ファイルでは、以下を定義します。

  • 機関を構成するクラウド インスタンスとテナント ID。
  • アプリケーションの登録から返されたクライアント ID。
  • クライアント シークレットまたは証明書のいずれか。

appsettings.json ファイル内で構成を定義する例を次に示します。 この例は、GitHub の .NET コンソール デーモンのコード サンプルから引用しています。

{
    "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]"
            }
        ]
    }
}

クライアント シークレットではなく証明書、またはワークロード ID フェデレーション資格情報を指定します。

MSAL アプリケーションをインスタンス化する

MSAL アプリケーションをインスタンス化するには、(言語に応じて) MSAL パッケージを追加、参照、またはインポートします。

使用しているのがクライアント シークレットか証明書か (または高度なシナリオとして、署名付きアサーションか) によって、構築に違いがあります。

パッケージの参照

アプリケーション コードで MSAL パッケージを参照します。

Microsoft.Identity.Web.TokenAcquisition NuGet パッケージをアプリケーションに追加します。 または、Microsoft Graph を呼び出す場合は、Microsoft.Identity.Web.GraphServiceClient パッケージを追加します。 プロジェクトは次のようになります。 appsettings.json ファイルを出力ディレクトリにコピーする必要があります。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <RootNamespace>daemon_console</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Identity.Web.GraphServiceClient" Version="2.12.2" />
  </ItemGroup>

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

Program.cs ファイルで、Microsoft.Identity.Web を参照する using ディレクティブをコードに追加します。

using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;

クライアント シークレットを使用して機密クライアント アプリケーションをインスタンス化する

クライアント シークレットを使用して機密クライアント アプリケーションをインスタンス化するコードを次に示します。

   class Program
    {
        static async Task Main(string[] _)
        {
            // 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 から読み取られます。

クライアント証明書を使用して機密クライアント アプリケーションをインスタンス化する

証明書を使用してアプリケーションをビルドするコードを次に示します。

コード自体はまったく同じです。 証明書は、構成で説明されています。 証明書を取得する方法はたくさんあります。 詳細については、「https://aka.ms/ms-id-web-certificates」を参照してください。 KeyVault から証明書を取得する方法を次に示します。 Microsoft ID から Azure Identity の DefaultAzureCredential に委任し、KeyVault から証明書にアクセスできる場合はマネージド ID を使用します。 アプリケーションはローカルでそのままデバッグできます。その後、開発者の資格情報を使用します。

  "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://yourKeyVaultUrl.vault.azure.net",
        "KeyVaultCertificateName": "NameOfYourCertificate"
      }

高度なシナリオ: クライアント アサーションを使用して機密クライアント アプリケーションをインスタンス化する

機密クライアント アプリケーションでは、クライアント シークレットや証明書に加えて、クライアント アサーションを使用して ID を証明することもできます。 詳細については、「CredentialDescription」を参照してください。

次のステップ

このシナリオの次の記事であるアプリのトークンの取得に関する記事に進みます。