共用方式為


取得權杖以使用精靈應用程式呼叫 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) 資源

用戶端認證所使用的範圍,應一律為其後接著 /.default 的資源識別碼。

重要

當 MSAL 要求接受 1.0 版存取權杖之資源的存取權杖時,Microsoft Entra ID 從要求的範圍中取用最後一個斜線之前的所有內容,並將其用作資源識別碼,以解析出所需的受眾。 因此,如果資源(如 Azure SQL Database https://database.windows.net)預期對象的結尾帶有斜線(對於 Azure SQL Database,https://database.windows.net/),您需要請求的範圍為https://database.windows.net//.default。 (請注意雙斜線。)另請參閱 MSAL.NET 問題#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;

通訊協定

若您還沒有所選語言的程式庫,可能會想要直接使用通訊協定:

第一個案例:使用共用密鑰存取權杖要求

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

情境二:使用憑證存取令牌請求

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 身分識別平台與 OAuth 2.0 用戶端認證流程

疑難排解

有使用 resource/.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 系統管理中心的企業應用程式 。 選取應用程式註冊,然後從左窗格的 [安全性] 區段中選取 [權限]。 接著選取標示為 對 {Tenant Name} 授予管理員同意 的大按鈕(其中 {Tenant Name} 是目錄的名稱)。

標準使用者

針對租用戶的標準使用者,請雲端應用程式管理員授予應用程式管理員同意。 若要這樣做,請將下列 URL 提供給系統管理員:

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

在 URL 中:

  • 以租用戶識別碼或租用戶名稱取代 Enter_the_Tenant_Id_Here (例如 contoso.microsoft.com)。
  • Enter_the_Application_Id_Here 是註冊之應用程式的應用程式 (用戶端) 識別碼。

當您使用上述 URL 向應用程式授與同意之後,可能會顯示此錯誤 AADSTS50011: No reply address is registered for the application。 發生此錯誤的原因是此應用程式和 URL 都沒有重新導向 URI。 請不用理會這一則訊息。

是否呼叫了自己的 API?

如果您的精靈應用程式呼叫您自己的 Web API,而且您無法將應用程式權限新增至精靈的應用程式註冊,您必須將應用程式角色新增至 Web API 的應用程式註冊

下一步

繼續本案例的下一篇文章:呼叫 Web API