デーモン アプリケーションを使用して Web API を呼び出すためのトークンを取得する

機密クライアント アプリケーションを構築したら、AcquireTokenForClient を呼び出し、スコープを渡し、必要に応じてトークンを強制的に更新することでアプリのトークンを取得できます。

要求するスコープ

クライアントの資格情報フローのために要求するスコープは、後に /.default が続くリソースの名前です。 この表記は、アプリケーションの登録時に静的に宣言された "アプリケーション レベルの権限" を使用するように Microsoft Entra ID に指示します。 また、これらの API アクセス許可は、テナント管理者によって付与される必要があります。

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

{
    "AzureAd": {
        // Same AzureAd section as before.
    },

    "MyWebApi": {
        "BaseUrl": "https://localhost:44372/",
        "RelativePath": "api/TodoList",
        "RequestAppToken": true,
        "Scopes": [ "[Enter here the scopes for your web API]" ]
    }
}

Azure AD (v1.0) リソース

クライアント資格情報に使用するスコープは、常に、リソース ID の後に /.default が続くものにする必要があります。

重要

MSAL がバージョン 1.0 のアクセス トークンを受け入れるリソースのためのアクセス トークンを要求すると、Microsoft Entra ID では、最後のスラッシュの前のすべてを取得してそれをリソース ID として使って、要求されたスコープから目的の対象ユーザーの解析が行われます。 したがって、Azure SQL Database () のように、 https://database.windows.net リソースは、末尾がスラッシュ (Azure SQL Database の場合) であることを想定している場合は、 https://database.windows.net/ のスコープを要求する必要があり https://database.windows.net//.default ます。 (二重スラッシュに注意してください)。「MSAL.NET issue #747: Resource url's trailing slash is omitted, which caused sql auth failure」も参照してください。

AcquireTokenForClient API

アプリのトークンを取得するには、プラットフォームに応じて AcquireTokenForClient またはそれと同等のものを使用します。

Microsoft.Identity.Web を使用すれば、トークンを取得する必要はありません。 デーモン アプリケーションからの Web API の呼び出しに関するページに示されているように、上位の API を使用できます。 ただし、トークンを必要とする SDK を使用している場合は、このトークンを取得する方法を次のコード スニペットに示します。

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

// In the Program.cs, acquire a token for your downstream API

var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
ITokenAcquirer acquirer = tokenAcquirerFactory.GetTokenAcquirer();
AcquireTokenResult tokenResult = await acquirer.GetTokenForUserAsync(new[] { "https://graph.microsoft.com/.default" });
string accessToken = tokenResult.AccessToken;

Protocol

選択した言語のライブラリがまだない場合は、プロトコルを直接使用することもできます。

最初のケース:共有シークレットを使用してトークン要求にアクセスする

POST /{tenant}/oauth2/v2.0/token HTTP/1.1           //Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=A1b-C2d_E3f.H4i,J5k?L6m!N7o-P8q_R9s.T0u
&grant_type=client_credentials

2 番目のケース:証明書を使用してトークン要求にアクセスする

POST /{tenant}/oauth2/v2.0/token HTTP/1.1               // Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_id=11112222-bbbb-3333-cccc-4444dddd5555
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=aaaaaaaa-0b0b-...
&grant_type=client_credentials

詳細については、プロトコルのドキュメント:Microsoft ID プラットフォームと OAuth 2.0 クライアント資格情報フロー

トラブルシューティング

リソース/.default スコープを使用しましたか?

無効なスコープを使用したことを示すエラー メッセージが表示された場合は、resource/.default スコープを使用しなかった可能性があります。

API を呼び出すときに、この操作を完了するのに十分な特権がありませんというエラーが表示された場合は、テナント管理者がアプリケーションにアクセス許可を付与する必要があります。

アプリケーションに管理者の同意を付与しない場合、次のエラーが発生します。

Failed to call the web API: Forbidden
Content: {
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "<guid>",
      "date": "<date>"
    }
  }
}

ロールに応じて、次のオプションのいずれかを選択します。

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

グローバル テナント管理者の場合は、Microsoft Entra 管理センターでエンタープライズ アプリケーションにアクセスします。 アプリの登録を選択し、左ペインの [セキュリティ] セクションで [アクセス許可] を選択します。 次に、[{テナント名} に管理者の同意を与えます] というラベルの付いた大きいボタンを選択します ({テナント名} はディレクトリの名前です)。

標準ユーザー

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

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

URL で以下を行ないます。

  • Enter_the_Tenant_Id_Here をテナント ID またはテナント名 (contoso.microsoft.com など) に置き換えます。
  • Enter_the_Application_Id_Here は、登録済みアプリケーションのアプリケーション (クライアント) ID です。

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

独自の API を呼び出している場合

デーモン アプリで独自の Web API を呼び出すとき、デーモンのアプリ登録にアプリのアクセス許可を追加できなかった場合、Web API のアプリ登録にアプリ ロールを追加する必要があります。

次のステップ

このシナリオの次の記事である Web API の呼び出しに関する記事に進みます。