同盟身分識別認證的重要考慮和限制

本文說明 Microsoft Entra 應用程式和使用者指派的受控識別上同盟身分識別認證的重要考慮、限制和限制。

如需同盟身分識別認證所啟用案例的詳細資訊,請參閱 工作負載身分識別同盟概觀

一般同盟身分識別認證考慮

適用於:應用程式和使用者指派的受控識別

任何有權建立應用程式註冊並新增秘密或憑證的任何人都可以將同盟身分識別認證新增至應用程式。 不過,如果 [使用者可以註冊應用程式] 參數在 Microsoft Entra 系統管理中心[使用者->使用者 設定] 刀鋒視窗中設定為 [否],您將無法建立應用程式註冊或設定同盟身分識別認證。 尋找系統管理員來代表您設定同盟身分識別認證、應用程式 管理員 istrator 或應用程式擁有者角色中的某人。

同盟身分識別認證不會取用 Microsoft Entra 租使用者服務主體物件配額。

最多可以將 20 個同盟身分識別認證新增至應用程式或使用者指派的受控識別。

當您設定同盟身分識別認證時,有數個重要的資訊提供:

  • issuersubject 是設定信任關係所需的重要資訊片段。 和 subject 的組合issuer在應用程式上必須是唯一的。 當外部軟體工作負載要求 Microsoft 身分識別平台 交換存取令牌的外部令牌時,系統會根據issuer外部令牌中提供的 和 宣告來檢查同盟身分識別認證的簽發者和subject主體值。 如果該驗證檢查通過,Microsoft 身分識別平台 對外部軟體工作負載發出存取令牌。

  • issuer 是外部識別提供者的 URL,必須符合 issuer 所交換之外部令牌的宣告。 必要。 issuer如果宣告在值中有前置或尾端空格符,則會封鎖令牌交換。 此欄位的字元限制為 600 個字元。

  • subject 是外部軟體工作負載的標識碼,必須符合 sub 所交換之外部令牌的 (subject) 宣告。 主體 沒有固定格式,因為每個 IdP 都會使用自己的格式,有時是 GUID,有時是冒號分隔標識符,有時是任意字串。 此欄位的字元限制為 600 個字元。

    重要

    主體設定值必須完全符合 GitHub 工作流程設定上的設定。 否則,Microsoft 身分識別平台將會查看傳入的外部權杖,並拒絕存取權杖的交換。 您將不會收到錯誤,交換會失敗且不會發生錯誤。

    重要

    如果您不小心在主體設定中新增不正確的外部工作負載資訊,則會成功建立同盟身分識別認證,而不會發生錯誤。 在令牌交換失敗之前,錯誤不會變得明顯。

  • 物件會 列出可以出現在外部令牌中的物件。 必要。 您必須新增單一物件值,其限制為600個字元。 建議值為 「api://AzureADTokenExchange」。 它說,Microsoft 身分識別平台 必須在傳入令牌的宣告中aud接受什麼。

  • name 是同盟身分識別認證的唯一標識符。 必要。 此欄位的字元限制為 3-120 個字元,而且必須是 URL 易記。 支援英數位元、虛線或底線字元,第一個字元必須是英數位元。  一旦建立它就不可變了。

  • description 是同盟身分識別認證的使用者提供的描述。 選擇性。 Microsoft Entra ID 不會驗證或檢查描述。 此欄位的限制為 600 個字元。

任何同盟身分識別認證屬性值都不支援通配符。

不支援的區域(使用者指派的受控識別)

適用於:使用者指派的受控識別

在下列區域中建立的使用者指派受控識別上,目前 不支援 建立同盟身分識別認證:

  • 東亞
  • 卡達中部
  • 馬來西亞南部
  • 義大利北部
  • 以色列中部

將會逐步推出在這些區域中,針對使用者指派的身分識別建立同盟身分識別認證的支援。需要使用同盟身分識別認證的此區域中的資源,可以藉由利用在支持區域中建立的使用者指派受控識別來執行此動作。

支援的簽署演算法和簽發者

適用於:應用程式和使用者指派的受控識別

只有提供使用 RS256 演演算法簽署之令牌的簽發者,才支援使用工作負載身分識別同盟進行令牌交換。 交換與其他演演算法簽署的令牌可能會運作,但尚未經過測試。

不支援 Microsoft Entra 簽發者

適用於:應用程式和使用者指派的受控識別

不支援從相同或不同租使用者建立兩個 Microsoft Entra 身分識別之間的同盟。 建立同盟身分識別認證時,不支援使用下列值設定 簽發者 (外部識別提供者的 URL):

  • *.login.microsoftonline.com
  • *.login.windows.net
  • *.login.microsoft.com
  • *.sts.windows.net

雖然有可能使用 Microsoft Entra 簽發者建立同盟身分識別認證,但嘗試將它用於授權失敗,併發生錯誤 AADSTS700222: AAD-issued tokens may not be used for federated identity flows

同盟認證變更傳播的時間

適用於:應用程式和使用者指派的受控識別

一開始設定之後,同盟身分識別認證需要一段時間才能傳播到整個區域。 設定同盟身分識別認證后幾分鐘進行的令牌要求可能會失敗,因為快取會在目錄中填入舊數據。 在此時間範圍期間,授權要求可能會失敗,並出現錯誤訊息: AADSTS70021: No matching federated identity record found for presented assertion.

若要避免此問題,請在新增同盟身分識別認證之後稍候一段時間,再要求令牌,以確保複寫會在授權服務的所有節點上完成。 我們也建議新增令牌要求的重試邏輯。 即使成功取得令牌之後,還是應該針對每個要求執行重試。 最後,在數據完全復寫之後,失敗的百分比將會下降。

不支援並行更新(使用者指派的受控識別)

適用於:使用者指派的受控識別

在相同使用者指派的受控識別下建立多個同盟身分識別認證,會同時觸發並行偵測邏輯,這會導致要求因 409 衝突的 HTTP 狀態代碼而失敗。

Terraform Provider for Azure (Resource Manager) 3.40.0 版引進的 更新 會循序建立多個同盟身分識別認證,而不是同時建立。 建立多重同盟身分識別時,早於 3.40.0 的版本可能會導致管線失敗。 建議您使用 Terraform Provider for Azure (Resource Manager) v3.40.0 或更新版本,以便循序建立多個同盟身分識別認證。

當您使用自動化或 Azure Resource Manager 範本 (ARM 範本) 在相同的父身分識別下建立同盟身分識別認證時,會循序建立同盟認證。 不同受控識別下的同盟身分識別認證可以平行建立,而不受任何限制。

如果在迴圈中布建同盟身分識別認證,您可以藉由設定 「mode」 : “serial” 來依序布建認證。

您也可以使用 dependsOn 屬性,循序布建多個新的同盟身分識別認證。 下列 Azure Resource Manager 範本 (ARM 範例會使用 dependsOn 屬性,依序在使用者指派的受控識別上建立三個新的同盟身分識別認證:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
        "userAssignedIdentities_parent_uami_name": { 
            "defaultValue": "parent_uami", 
            "type": "String" 
        } 
    }, 
    "variables": {}, 
    "resources": [ 
        { 
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities", 
            "apiVersion": "2022-01-31-preview", 
            "name": "[parameters('userAssignedIdentities_parent_uami_name')]", 
            "location": "eastus" 
        }, 
        { 
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials", 
            "apiVersion": "2022-01-31-preview", 
            "name": "[concat(parameters('userAssignedIdentities_parent_uami_name'), '/fic01')]", 
            "dependsOn": [ 
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentities_parent_uami_name'))]" 
            ], 
            "properties": { 
                "issuer": "https://kubernetes-oauth.azure.com", 
                "subject": "fic01", 
                "audiences": [ 
                    "api://AzureADTokenExchange" 
                ] 
            } 
        }, 
        { 
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials", 
            "apiVersion": "2022-01-31-preview", 
            "name": "[concat(parameters('userAssignedIdentities_parent_uami_name'), '/fic02')]", 
            "dependsOn": [ 
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentities_parent_uami_name'))]", 
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials', parameters('userAssignedIdentities_parent_uami_name'), 'fic01')]" 
            ], 
            "properties": { 
                "issuer": "https://kubernetes-oauth.azure.com", 
                "subject": "fic02", 
                "audiences": [ 
                    "api://AzureADTokenExchange" 
                ] 
            } 
        }, 
        { 
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials", 
            "apiVersion": "2022-01-31-preview", 
            "name": "[concat(parameters('userAssignedIdentities_parent_uami_name'), '/fic03')]", 
            "dependsOn": [ 
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentities_parent_uami_name'))]", 
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials', parameters('userAssignedIdentities_parent_uami_name'), 'fic02')]" 
            ], 
            "properties": { 
                "issuer": "https://kubernetes-oauth.azure.com", 
                "subject": "fic03", 
                "audiences": [ 
                    "api://AzureADTokenExchange" 
                ] 
            } 
        } 
    ] 
} 

Azure 原則

適用於:應用程式和使用者指派的受控識別

您可以使用拒絕 Azure 原則,如下列 ARM 範例所示:

{ 
"policyRule": { 
            "if": { 
                "field": "type", 
                "equals": "Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials" 
            }, 
            "then": { 
                "effect": "deny" 
            } 
        } 
}

節流限制

適用於:使用者指派的受控識別

下表描述使用者指派受控識別 REST API 的要求限制。 如果您超過節流限制,您會收到 HTTP 429 錯誤。

作業 每一 Microsoft Entra 租使用者每秒的要求數 每個訂用帳戶每秒的要求數 每個資源每秒的要求數
建立或更新 要求 10 2 0.25
取得 要求 30 10 0.5
依資源群組 列出或 依訂用帳戶 要求列出 15 5 0.25
刪除 要求 10 2 0.25

錯誤

適用於:應用程式和使用者指派的受控識別

建立、更新、取得、列出或刪除同盟身分識別認證時,可能會傳回下列錯誤碼。

HTTP 程式代碼 錯誤訊息 註解
405 要求格式非預期:不支援同盟身分識別認證。 此區域中未啟用同盟身分識別認證。 請參閱「目前支持的區域」。
400 同盟身分識別認證必須只有一個物件。 目前,同盟身分識別認證支援單一物件「api://AzureADTokenExchange」。
400 來自 HTTP 主體的同盟身分識別認證具有空白屬性 所有同盟身分識別認證屬性都是必要的。
400 同盟識別認證名稱 '{ficName}' 無效。 英數位元、虛線、底線,不超過 3-120 符號。 第一個符號為英數位元。
404 父使用者指派的身分識別不存在。 在同盟身分識別認證資源路徑中檢查使用者指派的身分識別名稱。
400 此受控識別已存在簽發者和主體組合。 這是條件約束。 列出與使用者指派身分識別相關聯的所有同盟身分識別認證,以尋找現有的同盟身分識別認證。
409 衝突 在相同使用者指派的身分識別下,對同盟身分識別認證資源的並行寫入要求已被拒絕。