適用対象: 従業員テナント
外部テナント (詳細)
このクイックスタートでは、サンプル デーモン アプリケーションを使用してアクセス トークンを取得し、 Microsoft Authentication Library (MSAL) を使用して保護された Web API を呼び出します。
開始する前に、このページの上部にある [テナントの種類 の選択] セレクターを使用して、テナントの種類を選択します。 Microsoft Entra ID には、 従業員 と 外部の 2 つのテナント構成が用意されています。 従業員テナントの構成は、従業員、内部アプリ、およびその他の組織リソースを対象としています。 外部テナントは、顧客向けのアプリ用です。
このクイック スタートで使用するサンプル アプリは、Microsoft Graph API を呼び出すアクセス トークンを取得します。
[前提条件]
- アクティブなサブスクリプションを持つ Azure アカウント。 アカウントをまだお持ちでない場合は、 無料でアカウントを作成してください。
- この Azure アカウントには、アプリケーションを管理するためのアクセス許可が必要です。 次の Microsoft Entra ロールには、必要なアクセス許可が含まれます。
- アプリケーション管理者
- アプリケーション開発者
- クラウド アプリケーション管理者
- 従業員テナント。 既定のディレクトリを使用するか、 新しいテナントを設定できます。
-
この組織のディレクトリ内のアカウント専用に構成された Microsoft Entra 管理センターに新しいアプリを登録します。 詳細については、「 アプリケーションの登録 」を参照してください。 後で使用するために、アプリケーション の [概要 ] ページから次の値を記録します。
- アプリケーション (クライアント) ID
- ディレクトリ (テナント) ID
- アプリの登録にクライアント シークレットを追加します。 運用アプリではクライアント シークレットを使用しないでください。 代わりに、証明書またはフェデレーション資格情報を使用してください。 詳細については、「 アプリケーションに資格情報を追加する」を参照してください。
- .NET 6.0 SDK の最小要件。
- Visual Studio 2022 または Visual Studio Code。
デーモン アプリに API アクセス許可を付与する
デーモン アプリが Microsoft Graph API のデータにアクセスするには、必要なアクセス許可を付与します。 デーモン アプリには、アプリケーションの種類のアクセス許可が必要です。 ユーザーはデーモン アプリケーションと対話できないため、テナント管理者はこれらのアクセス許可に同意する必要があります。 アクセス許可を付与して同意するには、次の手順を使用します。
.NET デーモン アプリの場合、アクセス許可を付与して同意する必要はありません。 このデーモン アプリは、独自のアプリ登録情報を読み取るので、アプリケーションのアクセス許可を与えられていない状態で読み取ることができます。
サンプル アプリケーションを複製またはダウンロードする
サンプル アプリケーションを取得するには、GitHub から複製するか、 .zip ファイルとしてダウンロードします。
- サンプルを複製するには、コマンド プロンプトを開き、プロジェクトを作成する場所に移動し、次のコマンドを入力します。
git clone https://github.com/Azure-Samples/ms-identity-docs-code-dotnet.git
- .zip ファイルをダウンロードします。 名前の長さが 260 文字未満のファイル パスに抽出します。
プロジェクトを構成する
クライアント デーモン アプリ サンプルでアプリ登録の詳細を使用するには、次の手順に従います。
コンソール ウィンドウを開き、 ms-identity-docs-code-dotnet/console-daemon ディレクトリに移動します。
cd ms-identity-docs-code-dotnet/console-daemon
Program.csを開き、ファイルの内容を次のスニペットに置き換えます。
// Full directory URL, in the form of https://login.microsoftonline.com/<tenant_id> Authority = " https://login.microsoftonline.com/Enter_the_tenant_ID_obtained_from_the_Microsoft_Entra_admin_center", // 'Enter the client ID obtained from the Microsoft Entra admin center ClientId = "Enter the client ID obtained from the Microsoft Entra admin center", // Client secret 'Value' (not its ID) from 'Client secrets' in the Microsoft Entra admin center ClientSecret = "Enter the client secret value obtained from the Microsoft Entra admin center", // Client 'Object ID' of app registration in Microsoft Entra admin center - this value is a GUID ClientObjectId = "Enter the client Object ID obtained from the Microsoft Entra admin center"
-
Authority
- 機関は、MSAL がトークンを要求できるディレクトリを示す URL です。 Enter_the_tenant_ID_obtained_from_the_Microsoft_Entra_admin_centerを、先ほど記録したディレクトリ (テナント) ID の値に置き換えます。 -
ClientId
- アプリケーションの識別子 。クライアントとも呼ばれます。 引用符で囲まれたテキストを、登録済みアプリケーションの概要ページから前に記録したApplication (client) ID
値に置き換えます。 -
ClientSecret
- Microsoft Entra 管理センターでアプリケーション用に作成されたクライアント シークレット。 クライアント シークレットの 値 を入力します。 -
ClientObjectId
- クライアント アプリケーションのオブジェクト ID。 引用符で囲まれたテキストを、登録済みアプリケーションの概要ページから前に記録したObject ID
値に置き換えます。
-
アプリケーションを実行してテストする
サンプル アプリを構成しました。 実行とテストに進むことができます。
コンソール ウィンドウから次のコマンドを実行して、アプリケーションをビルドして実行します。
dotnet run
アプリケーションが正常に実行されると、次のスニペットのような応答が表示されます (簡潔にするために短縮されます)。
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#applications/$entity",
"id": "00001111-aaaa-2222-bbbb-3333cccc4444",
"deletedDateTime": null,
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"applicationTemplateId": null,
"disabledByMicrosoftStatus": null,
"createdDateTime": "2021-01-17T15:30:55Z",
"displayName": "identity-dotnet-console-app",
"description": null,
"groupMembershipClaims": null,
...
}
動作方法
デーモン アプリケーションは、(ユーザーの代わりにではなく) それ自体に代わってトークンを取得します。 ユーザーは独自の ID を必要とするため、デーモン アプリケーションと対話できません。 この種類のアプリケーションは、アプリケーション ID、資格情報 (シークレットまたは証明書)、およびアプリケーション ID URI を提示することで、アプリケーション ID を使用してアクセス トークンを要求します。 デーモン アプリケーションは、標準の OAuth 2.0 クライアント資格情報付与フロー を使用してアクセス トークンを取得します。
アプリは、Microsoft ID プラットフォームからアクセス トークンを取得します。 アクセス トークンのスコープは、Microsoft Graph API です。 その後、アプリはアクセス トークンを使用して、Microsoft Graph API から独自のアプリケーション登録の詳細を要求します。 アクセス トークンに適切なアクセス許可がある限り、アプリは Microsoft Graph API から任意のリソースを要求できます。
このサンプルでは、ユーザーの ID ではなく、無人ジョブまたは Windows サービスをアプリケーション ID で実行する方法を示します。
関連コンテンツ
この ASP.NET Web アプリを「 チュートリアル: Microsoft ID プラットフォームにアプリケーションを登録する」シリーズを使用して構築します。
[前提条件]
- アクティブなサブスクリプションを持つ Azure アカウント。 アカウントをまだお持ちでない場合は、 無料でアカウントを作成してください。
- この Azure アカウントには、アプリケーションを管理するためのアクセス許可が必要です。 次の Microsoft Entra ロールには、必要なアクセス許可が含まれます。
- アプリケーション管理者
- アプリケーション開発者
- クラウド アプリケーション管理者
- 外部テナント。 作成するには、次の方法から選択します。
- (推奨) Microsoft Entra 外部 ID 拡張機能 を使用して、Visual Studio Code で外部テナントを直接設定します。
- Microsoft Entra 管理センターで新しい外部テナントを作成します。
- 次の構成で 、Microsoft Entra 管理センター に新しいアプリを登録します。 詳細については、「 アプリケーションの登録」を参照してください。
- 名前: ciam-daemon-app
- サポートされているアカウントの種類: この組織のディレクトリ内のアカウントのみ (シングル テナント)
- Visual Studio Code または別のコード エディター。
- .NET 7.0 以降。
- Node.js (ノード実装のみ)
クライアント シークレットを作成する
登録済みアプリケーションのクライアント シークレットを作成します。 アプリケーションは、トークンの要求時にクライアント シークレットを使用して ID を証明します。
- [ アプリの登録 ] ページで、作成したアプリケーション ( Web アプリ クライアント シークレットなど) を選択して [概要 ] ページを開きます。
- [ 管理] で、 証明書とシークレット>クライアント シークレット>新しいクライアント シークレットの順に選択します。
- [ 説明 ] ボックスに、クライアント シークレットの説明 ( Web アプリ クライアント シークレットなど) を入力します。
- [ 有効期限] で、(組織のセキュリティ規則に従って) シークレットが有効な期間を選択し、[ 追加] を選択します。
- シークレットの値を記録 します。 この値は、後の手順で構成に使用します。 証明書とシークレットから移動した後、シークレット値は再び表示されず、取得できません。 必ず記録してください。
機密クライアント アプリケーションの資格情報を作成する場合:
アプリケーションを運用環境に移行する前に、クライアント シークレットの代わりに証明書を使用することをお勧めします。 証明書の使用方法の詳細については、 Microsoft ID プラットフォーム アプリケーション認証証明書の資格情報の手順を参照してください。
テスト目的で、自己署名証明書を作成し、それに対して認証するようにアプリを構成できます。 ただし、 運用環境では、既知の証明機関によって署名された証明書を購入し、 Azure Key Vault を使用して証明書のアクセスと有効期間を管理する必要があります。
デーモン アプリに API アクセス許可を付与する
[ アプリの登録 ] ページで、作成したアプリケーション ( ciam-client-app など) を選択します。
[管理] の下にある [API のアクセス許可] を選択します。
[ 構成されたアクセス許可] で、[ アクセス許可の追加] を選択します。
組織で 使用している API タブを選択します。
API の一覧で、 ciam-ToDoList-api などの API を選択します。
[ アプリケーションのアクセス許可] オプションを選択します。 このオプションは、アプリ自体としてサインインする場合に選択しますが、ユーザーの代わりには選択しません。
アクセス許可の一覧から、 TodoList.Read.All、ToDoList.ReadWrite.All を選択します (必要に応じて検索ボックスを使用します)。
[ アクセス許可の追加] ボタンを選択します。
この時点で、アクセス許可が正しく割り当てられます。 ただし、デーモン アプリではユーザーが操作できないため、ユーザー自身がこれらのアクセス許可に同意することはできません。 この問題に対処するには、管理者がテナント内のすべてのユーザーに代わってこれらのアクセス許可に同意する必要があります。
- [< を選択し>、[はい] を選択します。
- [最新の情報に更新] を選択し、両方のアクセス許可の [状態<テナント名>が表示されることを確認します。
アプリ ロールを構成する
API は、クライアント アプリがアクセス トークンをそれ自体として取得するために、アプリケーションに対して少なくとも 1 つのアプリ ロール ( アプリケーションアクセス許可とも呼ばれます) を発行する必要があります。 アプリケーションのアクセス許可は、クライアント アプリケーションが自身として正常に認証できるようにし、ユーザーをサインインさせる必要がない場合に API が発行する必要があるアクセス許可の種類です。 アプリケーションのアクセス許可を発行するには、次の手順に従います。
[ アプリの登録 ] ページで、作成したアプリケーション ( ciam-ToDoList-api など) を選択して [概要 ] ページを開きます。
[ 管理] で、[ アプリ ロール] を選択します。
[ アプリ ロールの作成] を選択し、次の値を入力し、[ 適用 ] を選択して変更を保存します。
プロパティ 価値 [表示名] ToDoList.Read.All 許可されるメンバー型 アプリケーション 価値 ToDoList.Read.All Description アプリが 'TodoListApi' を使用してすべてのユーザーの ToDo リストを読み取れるようにする このアプリ ロールを有効にしますか? チェックしたままにする [ アプリ ロールの作成 ] をもう一度選択し、2 つ目のアプリ ロールに次の値を入力し、[ 適用 ] を選択して変更を保存します。
プロパティ 価値 [表示名] ToDoList.ReadWrite.All 許可されるメンバー型 アプリケーション 価値 ToDoList.ReadWrite.All Description アプリで 'ToDoListApi' を使用して、すべてのユーザーの ToDo リストの読み取りと書き込みを許可する このアプリ ロールを有効にしますか? チェックしたままにする
オプションクレームの設定
idtyp の省略可能な要求を追加して、Web API がトークンがアプリ トークンかアプリ+ ユーザー トークンかを判断するのに役立ちます。 scp とロール要求の組み合わせを同じ目的で使用できますが、idtyp 要求を使用すると、アプリ トークンとアプリ + ユーザー トークンを区別する最も簡単な方法です。 たとえば、トークンが アプリ 専用トークンの場合、この要求の値は app です。
サンプル デーモン アプリケーションと Web API を複製またはダウンロードする
サンプル アプリケーションを取得するには、GitHub から複製するか、.zip ファイルとしてダウンロードします。
サンプルを複製するには、コマンド プロンプトを開き、プロジェクトを作成する場所に移動し、次のコマンドを入力します。
git clone https://github.com/Azure-Samples/ms-identity-ciam-javascript-tutorial.git
または、 ファイル .zip サンプルをダウンロードし、名前の長さが 260 文字未満のファイル パスに抽出します。
プロジェクトの依存関係をインストールする
コンソール ウィンドウを開き、Node.js サンプル アプリを含むディレクトリに移動します。
cd 2-Authorization\3-call-api-node-daemon\App
次のコマンドを実行して、アプリの依存関係をインストールします。
npm install && npm update
サンプル デーモン アプリと API を構成する
クライアント Web アプリ サンプルでアプリ登録の詳細を使用するには、次の手順に従います。
コード エディターで、ファイル
App\authConfig.js
開きます。プレースホルダーを見つけます。
Enter_the_Application_Id_Here
を選択し、先ほど登録したデーモン アプリのアプリケーション (クライアント) ID に置き換えます。Enter_the_Tenant_Subdomain_Here
ディレクトリ (テナント) サブドメインに置き換えます。 たとえば、テナントのプライマリ ドメインがcontoso.onmicrosoft.com
されている場合は、contoso
を使用します。 テナント名がない場合は、 テナントの詳細を読み取る方法について説明します。Enter_the_Client_Secret_Here
を選択し、前にコピーしたデーモン アプリ シークレット値に置き換えます。Enter_the_Web_Api_Application_Id_Here
を選択し、先ほどコピーした Web API のアプリケーション (クライアント) ID に置き換えます。
Web API サンプルでアプリの登録を使用するには:
コード エディターで、ファイル
API\ToDoListAPI\appsettings.json
開きます。プレースホルダーを見つけます。
Enter_the_Application_Id_Here
を選択し、コピーした Web API のアプリケーション (クライアント) ID に置き換えます。Enter_the_Tenant_Id_Here
を選択し、先ほどコピーしたディレクトリ (テナント) ID に置き換えます。Enter_the_Tenant_Subdomain_Here
ディレクトリ (テナント) サブドメインに置き換えます。 たとえば、テナントのプライマリ ドメインがcontoso.onmicrosoft.com
されている場合は、contoso
を使用します。 テナント名がない場合は、 テナントの詳細を読み取る方法について説明します。
サンプル デーモン アプリと API の実行とテスト
サンプル アプリを構成しました。 実行とテストに進むことができます。
コンソール ウィンドウを開き、次のコマンドを使用して Web API を実行します。
cd 2-Authorization\3-call-api-node-daemon\API\ToDoListAPI dotnet run
次のコマンドを使用して、Web アプリ クライアントを実行します。
2-Authorization\3-call-api-node-daemon\App node . --op getToDos
デーモン アプリと Web API が正常に実行されると、コンソール ウィンドウに次の JSON 配列のようなものが表示されます
{
"id": 1,
"owner": "3e8....-db63-43a2-a767-5d7db...",
"description": "Pick up grocery"
},
{
"id": 2,
"owner": "c3cc....-c4ec-4531-a197-cb919ed.....",
"description": "Finish invoice report"
},
{
"id": 3,
"owner": "a35e....-3b8a-4632-8c4f-ffb840d.....",
"description": "Water plants"
}
動作方法
Node.js アプリは 、OAuth 2.0 クライアント資格情報付与フロー を使用して、ユーザーではなく、それ自体のアクセス トークンを取得します。 アプリが要求するアクセス トークンには、ロールとして表されるアクセス許可が含まれます。 クライアント資格情報フローでは、アプリケーション トークンのユーザー スコープの代わりに、この一連のアクセス許可が使用されます。 前に Web API で これらのアプリケーションのアクセス許可を公開 し、 デーモン アプリに付与しました。
API 側のサンプル .NET Web API では、API はアクセス トークンに必要なアクセス許可 (アプリケーションのアクセス許可) があることを確認する必要があります。 Web API は、必要なアクセス許可を持たないアクセス トークンを受け入れることはできません。
データへのアクセス
Web API エンドポイントは、ユーザーとアプリケーションの両方からの呼び出しを受け入れるように準備する必要があります。 したがって、それに応じて各要求に応答する方法が必要です。 たとえば、委任されたアクセス許可/スコープを介したユーザーからの呼び出しは、ユーザーのデータ to-do リストを受け取ります。 一方、アプリケーションのアクセス許可/ロールを介したアプリケーションからの呼び出しは、to-do リスト全体を受け取る場合があります。 ただし、この記事ではアプリケーション呼び出しのみを行っているので、委任されたアクセス許可/スコープを構成する必要はありませんでした。