如何使用 App Service 和 Azure Functions 的受控身分識別

本文示範如何為 App Service 和 Azure Functions 應用程式建立受控身分識別,並用於存取其他資源。

重要

因為受控識別不支援跨目錄案例,因此如果您的應用程式跨訂用帳戶或租用戶移轉,則不會如預期般運作。 若要在這類移轉後重建受控識別,請參閱如果我將訂用帳戶移到另一個目錄,系統是否會自動重新建立受控識別?。 下游資源也必須更新存取原則,才能使用新的身分識別。

注意

Azure Arc 中部署的應用程式無法使用受控識別。

Microsoft Entra ID 的受控識別,可讓應用程式輕鬆存取其他受到 Microsoft Entra 保護的資源 (例如 Azure Key Vault)。 身分識別由 Azure 平台負責管理,因此您不需要佈建或輪替任何密碼。 如需有關 Microsoft Entra ID 中受控識別的詳細資訊,請參閱適用於 Azure 資源的受控識別

您的應用程式可以授與兩種類型的身分識別:

  • 系統指派的身分識別會繫結至您的應用程式,如果您的應用程式已刪除,則會被刪除。 應用程式只能有一個系統指派的身分識別。
  • 使用者指派的身分識別是一項獨立 Azure 資源,可指派給您的應用程式。 應用程式可以有多個使用者指派的身分識別。

受控識別設定是位置的特有項目。 若要在入口網站設定部署位置的受控識別,請先導覽至位置。 若要使用 Azure 入口網站,在 Microsoft Entra 租用戶中尋找 Web 應用程式或部署位置的受控識別,請直接從租用戶的 [概觀] 頁面搜尋。 位置名稱通常類似 <app-name>/slots/<slot-name>

此影片顯示如何使用 App Service 的受控識別。

下列各節也會說明影片中的步驟。

新增系統指派的身分識別

  1. 在應用程式頁面的左側瀏覽中,向下捲動至 [設定] 群組。

  2. 選取 [身分識別]。

  3. 在 [系統指派] 索引標籤內,將 [狀態] 切換為 [開啟]。 按一下 [檔案] 。

    此螢幕快照顯示將 [狀態] 切換至 [開啟] 的位置,然後選取 [儲存]。

新增使用者指派的身分識別

利用使用者指派的身分識別建立應用程式會需要您建立身分識別,然後將其資源識別碼新增到您的應用程式設定中。

首先,您必須建立使用者指派的身分識別資源。

  1. 根據這些指示建立使用者指派的受控識別資源。

  2. 在應用程式頁面的左側瀏覽中,向下捲動至 [設定] 群組。

  3. 選取 [身分識別]。

  4. 選取 [使用者指派]>[新增]

  5. 搜尋並選取您之前建立的身分識別,然後選取 [新增]

    App Service 中的受控識別

    選取 [新增] 後,應用程式就會重新啟動。

設定目標資源

您可能必須設定目標資源,讓應用程式或函數得以存取。 例如,若您要求權杖以存取 Key Vault,則須新增存取原則並包含該應用程式或函數的受控識別。 否則即使呼叫 Key Vault 時使用有效權杖,仍將遭拒絕。 對 Azure SQL Database 而言,也是如此。 若要深入瞭解哪些資源支援 Microsoft Entra 權杖,請參閱支援 Microsoft Entra 驗證的 Azure 服務

重要

受控身分識別的後端服務會將每個資源的 URI 快取保留大約 24 小時。 如果您更新特定目標資源的存取原則,並立即擷取該資源的權杖,則可以繼續取得具有過期權限的快取權杖,直到該權杖到期為止。 目前沒有任何方法可以強制重新整理權杖。

以應用程式程式碼連線至 Azure 服務

應用程式可透過受控識別取得權杖,以存取受 Microsoft Entra ID 保護的 Azure 資源,例如 Azure SQL Database、Azure Key Vault 和 Azure 儲存體。 這些權杖代表存取資源的應用程式,而不是任何特定的應用程式使用者。

App Service 和 Azure Functions 提供內部可存取的 REST 端點來擷取權杖。 您可使用標準 HTTP GET 存取應用程式內的 REST 端點,這可每種程式語言的通用 HTTP 用戶端進行實作。 針對 .NET、JavaScript、JAVA 和 Python,Azure 身分識別用戶端程式庫會在此 REST 端點上提供抽象概念,並簡化開發體驗。 連線至其他 Azure 服務就如同將認證物件新增至服務特定用戶端一樣簡單。

原始 HTTP GET 要求如下列範例所示:

GET /MSI/token?resource=https://vault.azure.net&api-version=2019-08-01 HTTP/1.1
Host: localhost:4141
X-IDENTITY-HEADER: 853b9a84-5bfa-4b22-a3f3-0b9a43d9ad8a

範例回應如下所示:

HTTP/1.1 200 OK
Content-Type: application/json

{
    "access_token": "eyJ0eXAi…",
    "expires_on": "1586984735",
    "resource": "https://vault.azure.net",
    "token_type": "Bearer",
    "client_id": "5E29463D-71DA-4FE0-8E69-999B57DB23B0"
}

該回應與 Microsoft Entra 服務對服務存取權杖要求的回應相同。 若要存取 Key Vault,請將 access_token 的值新增至與保存庫連線的用戶端。

如需 REST 端點的詳細資訊,請參閱 REST 端點參考

移除身分識別

當您移除系統指派的身分識別時,隨即從 Microsoft Entra ID 中刪除。 刪除應用程式資源本身時,系統指派的身分識別也會從 Microsoft Entra ID 自動移除。

  1. 在應用程式頁面的左側瀏覽中,向下捲動至 [設定] 群組。

  2. 選取 [身分識別]。 接著依據身分識別類型,遵循步驟:

    • 系統指派的身分識別:在 [系統指派] 索引標籤內,將 [狀態] 切換為 [關閉]。 按一下 [檔案] 。
    • 使用者指派的身分識別:選取 [使用者指派] 索引標籤,選取身分識別的核取方塊,然後選取 [移除]。 選取以確認。

注意

還可以設定另一個應用程式設定:WEBSITE_DISABLE_MSI,這只會停用本機權杖服務。 不過,系統會將身分識別留在原地,且工具仍會將受控身分識別顯示為「開啟」或「已啟用」。因此,不建議使用這個設定。

REST 端點參考

具有受控識別的應用程式可定義兩個環境變數來提供此端點:

  • IDENTITY_ENDPOINT - 本機權杖服務的 URL。
  • IDENTITY_HEADER - 用於協助減輕伺服器端要求偽造 (SSRF) 攻擊的標頭。 值會由平台旋轉。

IDENTITY_ENDPOINT 是應用程式要求權杖的來源本機 URL。 若要取得資源的權杖,請向該端點提出包含以下參數的 HTTP GET 要求:

參數名稱 In 描述
resource 查詢 資源的 Microsoft Entra 資源 URI,也就是要取得權杖的目標資源。 這可能是其中一個支援 Microsoft Entra 驗證的 Azure 服務,或任何其他資源 URI。
api-version 查詢 要使用的權杖 API 版本。 使用 2019-08-01
X-IDENTITY-HEADER 頁首 IDENTITY_HEADER 環境變數的值。 此標頭用來協助減輕伺服器端要求偽造 (SSRF) 攻擊。
client_id 查詢 (選擇性) 要使用的使用者指派身分識別,其用戶端識別碼。 不能用於包含 principal_idmi_res_idobject_id 的要求。 如果省略所有識別碼參數 (client_idprincipal_idobject_idmi_res_id),則會使用系統指派的身分識別。
principal_id 查詢 (選擇性) 要使用的使用者指派身分識別,其主體識別碼。 object_id 是可代替使用的別名。 無法用於包含client_id、mi_res_id或object_id的要求。 如果省略所有識別碼參數 (client_idprincipal_idobject_idmi_res_id),則會使用系統指派的身分識別。
mi_res_id 查詢 (選擇性) 要使用的使用者指派身分識別,其 Azure 資源識別碼。 不能用於包含 principal_idclient_idobject_id 的要求。 如果省略所有識別碼參數 (client_idprincipal_idobject_idmi_res_id),則會使用系統指派的身分識別。

重要

如果您嘗試取得使用者指派身分識別的權杖,則必須包含其中一個選擇性屬性。 否則,權杖服務會嘗試取得系統指派身分識別的權杖,這不一定會存在。

下一步