Web API を呼び出すデーモン アプリ - トークンを取得する
機密クライアント アプリケーションを構築したら、AcquireTokenForClient を呼び出し、スコープを渡し、必要に応じてトークンを強制的に更新することでアプリのトークンを取得できます。
要求するスコープ
クライアントの資格情報フローのために要求するスコープは、後に /.default が続くリソースの名前です。 この表記は、アプリケーションの登録時に静的に宣言された "アプリケーション レベルのアクセス許可" を使用するように Azure Active Directory (Azure AD) に指示します。 また、これらの API アクセス許可は、テナント管理者によって付与される必要があります。
ResourceId = "someAppIDURI";
var scopes = new [] { ResourceId+"/.default"};
Azure AD (v1.0) リソース
クライアント資格情報に使用するスコープは、常に、リソース ID の後に /.default が続くものにする必要があります。
重要
MSAL がバージョン 1.0 のアクセス トークンを受け入れるリソースのためのアクセス トークンを要求すると、Azure AD では、最後のスラッシュの前のすべてを取得し、それをリソース 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 またはそれと同等のものを使用します。
using Microsoft.Identity.Client;
// With client credentials flows, the scope is always of the shape "resource/.default" because the
// application permissions need to be set statically (in the portal or by PowerShell), and then granted by
// a tenant administrator.
string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
AuthenticationResult result = null;
try
{
result = await app.AcquireTokenForClient(scopes)
.ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
// The application doesn't have sufficient permissions.
// - Did you declare enough app permissions during app creation?
// - Did the tenant admin grant permissions to the application?
}
catch (MsalServiceException ex) when (ex.Message.Contains("AADSTS70011"))
{
// Invalid scope. The scope has to be in the form "https://resourceurl/.default"
// Mitigation: Change the scope to be as expected.
}
AcquireTokenForClient によるアプリケーション トークン キャッシュの使用
MSAL.NET では、AcquireTokenForClient によってアプリケーション トークン キャッシュが使用されます (他のすべての AcquireTokenXX メソッドでは、ユーザー トークン キャッシュが使用されます)。AcquireTokenSilent は "ユーザー" トークン キャッシュを使用するため、AcquireTokenForClient を呼び出す前に AcquireTokenSilent を呼び出さないでください。 AcquireTokenForClient はアプリケーション トークン キャッシュそのものをチェックして、更新します。
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=535fb089-9ff3-47b6-9bfb-4f1264799865
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=qWgdYAmab0YSkuL1qKv5bPX
&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=97e0a5b7-d745-40b6-94fe-5f77d35c6e05
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJ{a lot of characters here}M8U3bSUKKJDEg
&grant_type=client_credentials
詳細については、プロトコルのドキュメント:Microsoft ID プラットフォームと OAuth 2.0 クライアント資格情報フロー。
トラブルシューティング
リソース/.default スコープを使用しましたか?
無効なスコープを使用したことを示すエラー メッセージが表示された場合は、resource/.default スコープを使用しなかった可能性があります。
管理者の同意を提供するのを忘れましたか? デーモン アプリにはそれが必要です。
API を呼び出すときに、この操作を完了するのに十分な特権がありませんというエラーが表示された場合は、テナント管理者がアプリケーションにアクセス許可を付与する必要があります。 上記のクライアント アプリの登録の手順 6 を参照してください。 通常、次のようなエラーが表示されます。
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>"
}
}
}
独自の API を呼び出している場合
デーモン アプリで独自の Web API を呼び出すとき、デーモンのアプリ登録にアプリのアクセス許可を追加できなかった場合、Web API のアプリ登録にアプリ ロールを追加する必要があります。
次のステップ
このシナリオの次の記事である Web API の呼び出しに関する記事に進みます。