分享方式:


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