本文說明 Spring Cloud Azure 認證方法,並協助你選擇合適的憑證類型來保護 Azure 資源的存取權。
使用 Microsoft Entra 識別碼進行驗證和授權
透過使用 Microsoft Entra ID,您可以使用 Azure 角色基礎存取控制(Azure RBAC)授權安全主體權限,該主體可以是使用者或應用程式服務主體。 當安全主體(使用者或應用程式)嘗試存取 Azure 資源,例如事件集線中心資源時,該請求必須獲得授權。 使用 Microsoft Entra ID 時,存取資源是一個兩步驟的過程:
- 首先,驗證安全主體的身份並回傳一個 OAuth 2.0 令牌。
- 接著,將權杖作為請求的一部分傳遞給 Azure 服務,授權存取指定資源。
認證類型
Spring Cloud Azure 允許你設定不同的憑證類型來進行驗證,包括 DefaultAzureCredential、 WorkloadIdentityCredential、 ManagedIdentityCredentialClientSecretCredentialAzureCliCredential等。
DefaultAzureCredential (預設Azure憑證)
DefaultAzureCredential 適用於應用程式打算在 Azure 雲端中執行的大部分案例,因為它結合了下列認證:
- 通常用來在部署時進行驗證的認證。
- 用來在開發環境中進行驗證的認證。
注意
DefaultAzureCredential透過合理預設行為處理常見情境,簡化了使用 Azure SDK 的入門流程。 如果你想要更多控制或預設設定不支援你的情境,請使用其他憑證類型。
DefaultAzureCredential 嘗試透過下列機制進行驗證,以便:
- 環境(Environment)-
DefaultAzureCredential嘗試讀取透過環境變數指定的帳號資訊,並用來驗證。 - 管理身份 - 如果應用程式部署到啟用管理身份的 Azure 主機,嘗試
DefaultAzureCredential使用該帳號進行認證。 - 工作負載身份 - 若應用程式部署至虛擬機(VM),
DefaultAzureCredential嘗試使用該帳號進行認證。 - 共享令牌快取 - 如果你是透過 Visual Studio 驗證,嘗試
DefaultAzureCredential用該帳號來驗證。 - IntelliJ - 如果你是透過 Azure Toolkit for IntelliJ 認證,
DefaultAzureCredential會嘗試用該帳號來驗證。 - Azure CLI - 如果你透過 Azure CLI
az login指令驗證了一個帳號,DefaultAzureCredential嘗試用該帳號來驗證。 - Azure PowerShell - 如果你是透過 Azure PowerShell 認證的,嘗試
DefaultAzureCredential用該帳號來驗證。 - Azure Developer CLI - 如果你是透過 Azure Developer CLI 認證的,
DefaultAzureCredential請嘗試用該帳號來驗證。
提示
請確定安全性主體有足夠的許可權可存取 Azure 資源。 如需詳細資訊,請參閱 使用 Microsoft Entra ID授權存取權。
注意
由於 Spring Cloud Azure AutoConfigure 4.1.0,您必須註冊名為 ThreadPoolTaskExecutor 的 springCloudAzureCredentialTaskExecutor bean 來管理 Azure 身分識別所建立的所有線程。 這個線程集區所管理的每個線程名稱前面都會加上 az-identity-。 這個 ThreadPoolTaskExecutor 豆與 Spring Boot 所提供的 Executor 豆無關。
受控識別
常見的挑戰是管理用來保護組成解決方案之不同元件之間通訊的秘密和認證。 受控識別不需要管理認證。 受控識別提供身分識別,讓應用程式在連線到支援Microsoft Entra 驗證的資源時使用。 應用程式可以使用管理身份來取得 Microsoft Entra 令牌。 例如,應用程式可以使用管理身份來存取像 Azure Key Vault 這類資源,在那裡你可以以安全的方式儲存憑證,或存取儲存帳號。
在應用程式中使用管理身份(managed identity)代替 連接字串 或 key,因為這樣比較安全,也省去管理秘密和憑證的麻煩。 在這種情況下,DefaultAzureCredential更適合本地開發的情境,先使用本地儲存的帳號資訊,然後部署應用程式到 Azure 雲端,並使用管理身份。
受控識別類型
受控識別有兩種類型:
- 系統指派 - 某些 Azure 服務可讓您直接在服務實例上啟用受控識別。 當你啟用系統指派的管理身份時,你會在 Microsoft Entra 中建立一個綁定到該服務實例生命週期的身份。 所以當你刪除資源時,Azure 會自動幫你刪除該身份。 根據設計,只有 Azure 資源才能使用此身分識別來要求來自Microsoft Entra 識別碼的令牌。
- 使用者指派 - 你也可以建立一個獨立的 Azure 資源來管理身份。 您可以建立使用者指派的受控識別,並將它指派給 Azure 服務的一或多個實例。 使用使用者指派的管理身份,你將身份與使用該身份的資源分開管理。
注意
使用使用者指派的管理身份時,請透過 spring.cloud.azure.credential.client-id 或 spring.cloud.azure.<azure-service>.credential.client-id。 如果您使用系統指派的受控識別,則不需要認證設定。
提示
要存取 Azure 資源,請確保安全主體擁有足夠的權限。 如需詳細資訊,請參閱 使用 Microsoft Entra ID授權存取權。
如需受控識別的詳細資訊,請參閱 什麼是 Azure 資源的受控識別?。
其他認證類型
如果你想要比 DefaultAzureCredential,或預設設定不支援你的情況,請使用其他憑證類型。
使用 Microsoft Entra 識別碼進行驗證
要將應用程式連接到支援 Microsoft Entra 認證的資源,請以前綴spring.cloud.azure.credentialspring.cloud.azure.<azure-service>.credential或 。
下表列出驗證屬性:
| 財產 | 描述 |
|---|---|
client-id |
使用 Azure 執行服務主體驗證時要使用的用戶端識別碼。 |
client-secret |
使用 Azure 執行服務主體驗證時要使用的客戶端密碼。 |
client-certificate-path |
使用 Azure 執行服務主體驗證時要使用的 PEM 憑證檔案路徑。 |
client-certificate-password |
憑證檔案的密碼。 |
username |
使用 Azure 執行使用者名稱/密碼驗證時要使用的用戶名稱。 |
password |
使用 Azure 執行使用者名稱/密碼驗證時要使用的密碼。 |
managed-identity-enabled |
是否要啟用受控識別。 |
token-credential-bean-name |
使用 Azure 執行驗證時所要使用的 TokenCredential 類型 bean 名稱。 |
提示
如需所有 Spring Cloud Azure 組態屬性的清單,請參閱 Spring Cloud Azure 組態屬性。
應用程式會尋找數個位置來尋找可用的認證。 每個 Azure SDK 客戶端建構工廠會先採用一個自訂 TokenCredential bean,如果你指定屬性token-credential-bean-name,則會先採用 ,若未設定憑證屬性,則會退回使用DefaultAzureCredential。
使用自定義的 TokenCredential bean 進行驗證
以下範例說明如何定義 TokenCredential 自訂豆來進行驗證:
@Bean
TokenCredential myTokenCredential() {
// Your concrete TokenCredential instance
}
spring.cloud.azure:
credential:
token-credential-bean-name: myTokenCredential
使用系統指派的受控識別進行驗證
以下範例展示了如何利用系統指派的管理身份進行驗證:
spring.cloud.azure:
credential:
managed-identity-enabled: true
使用使用者指派的受控識別進行驗證
以下範例展示了如何使用使用者指派的管理身份來進行認證:
spring.cloud.azure:
credential:
managed-identity-enabled: true
client-id: ${AZURE_CLIENT_ID}
使用服務主體搭配客戶端密碼進行驗證
以下範例展示了如何利用帶有客戶端秘密的服務主體來進行認證:
spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
profile:
tenant-id: <tenant>
注意
tenant-id 允許的值包括:common、organizations、consumers或租用戶標識碼。 如需這些值的詳細資訊,請參閱 錯誤AADSTS50020 - 身分識別提供者的用戶帳戶不存在於租使用者的 使用錯誤的端點(個人和組織帳戶)一節。 如需轉換單一租使用者應用程式的資訊,請參閱 將單一租使用者應用程式轉換成多租使用者Microsoft Entra ID。
使用服務主體搭配客戶端憑證進行驗證
以下範例說明如何利用服務主體與客戶端 PFX 憑證進行認證:
spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CLIENT_CERTIFICATE_PASSWORD}
profile:
tenant-id: <tenant>
注意
tenant-id 允許的值包括:common、organizations、consumers或租用戶標識碼。 如需這些值的詳細資訊,請參閱 錯誤AADSTS50020 - 身分識別提供者的用戶帳戶不存在於租使用者的 使用錯誤的端點(個人和組織帳戶)一節。 如需轉換單一租使用者應用程式的資訊,請參閱 將單一租使用者應用程式轉換成多租使用者Microsoft Entra ID。
以下範例說明如何利用服務主體與客戶端 PEM 憑證進行認證:
spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}
profile:
tenant-id: <tenant>
注意
tenant-id 允許的值包括:common、organizations、consumers或租用戶標識碼。 如需這些值的詳細資訊,請參閱 錯誤AADSTS50020 - 身分識別提供者的用戶帳戶不存在於租使用者的 使用錯誤的端點(個人和組織帳戶)一節。 如需轉換單一租使用者應用程式的資訊,請參閱 將單一租使用者應用程式轉換成多租使用者Microsoft Entra ID。
使用使用者憑證進行認證
以下範例展示了如何使用使用者憑證進行認證:
spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
username: ${AZURE_USER_USERNAME}
password: ${AZURE_USER_PASSWORD}
使用與他人不同的憑證來驗證服務
以下範例展示了如何使用不同的服務主體與 金鑰保存庫 進行認證。 此範例會使用兩個認證來設定應用程式:一個系統指派的受控識別和一個服務主體。 金鑰保存庫 秘密用戶端會使用服務主體,但任何其他元件會改用受控識別。
spring.cloud.azure:
credential:
managed-identity-enabled: true
keyvault.secret:
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
profile:
tenant-id: <tenant>
注意
tenant-id 允許的值包括:common、organizations、consumers或租用戶標識碼。 如需這些值的詳細資訊,請參閱 錯誤AADSTS50020 - 身分識別提供者的用戶帳戶不存在於租使用者的 使用錯誤的端點(個人和組織帳戶)一節。 如需轉換單一租使用者應用程式的資訊,請參閱 將單一租使用者應用程式轉換成多租使用者Microsoft Entra ID。
使用 Microsoft Entra 識別符授權存取權
授權步驟需要將一個或多個 Azure 角色指派給安全主體。 你指派給安全主體的角色決定了主體擁有的權限。
提示
如需所有 Azure 內建角色的清單,請參閱
下表列出 Azure 內建角色,以授權存取 Spring Cloud Azure 中支援的 Azure 服務:
| 角色 | 描述 |
|---|---|
| 應用程式設定數據擁有者 | 允許完整存取應用程式組態數據。 |
| 應用程式組態數據讀取器 | 允許讀取應用程式組態數據。 |
| Azure 事件中樞數據擁有者 | 允許完整存取 Azure 事件中樞資源。 |
| Azure 事件中樞數據接收器 | 允許接收 Azure 事件中樞資源的存取權。 |
| Azure 事件中樞數據傳送者 | 允許傳送對 Azure 事件中樞資源的存取權。 |
| Azure 服務總線數據擁有者 | 允許完整存取 Azure 服務總線資源。 |
| Azure 服務總線數據接收器 | 允許接收 Azure 服務總線資源的存取權。 |
| Azure 服務總線數據傳送者 | 允許將存取權傳送至 Azure 服務總線資源。 |
| 記憶體 Blob 資料擁有者 | 提供 Azure 記憶體 Blob 容器和數據的完整存取權,包括指派 POSIX 訪問控制。 |
| 記憶體 Blob 資料讀取器 | 讀取並列出 Azure 記憶體容器和 Blob。 |
| 記憶體佇列數據讀取器 | 讀取和列出 Azure 記憶體佇列和佇列訊息。 |
| Redis 快取參與者 | 管理 Redis 快取。 |
注意
當你使用 Spring Cloud Azure Resource Manager 取得事件中心、服務匯流排 和 Storage Queue 的連線字串,或 Cache for Resis 的屬性時,請指定 Azure 內建角色Contributor。 Azure Cache for Redis 很特別,您也可以指派 Redis Cache Contributor 角色以取得 Redis 屬性。
注意
金鑰保存庫 存取政策決定特定安全主體,即使用者、應用程式或使用者群組,是否能對 金鑰保存庫 的秘密、金鑰與憑證執行不同操作。 你可以透過 Azure 入口網站、Azure CLI 或 Azure PowerShell 來指派存取政策。 如需詳細資訊,請參閱 指派金鑰保存庫存取原則。
重要
Azure Cosmos DB 會公開兩個內建角色定義:Cosmos DB Built-in Data Reader 和 Cosmos DB Built-in Data Contributor。 不過,尚未提供角色管理的 Azure 入口網站支援。 如需許可權模型、角色定義和角色指派的詳細資訊,請參閱 使用 Azure Cosmos DB 帳戶的 Microsoft Entra ID 設定角色型存取控制。
使用 SAS 憑證進行認證
您也可以透過使用共享存取簽章(SAS)來設定服務進行認證。 使用該 spring.cloud.azure.<azure-service>.sas-token 屬性來設定此認證。 例如,使用 spring.cloud.azure.storage.blob.sas-token 來驗證 Storage Blob 服務。
透過連線字串進行認證
部分 Azure 服務支援連線字串以提供連線資訊與憑證。 要用連線字串連接那些 Azure 服務,請設定 spring.cloud.azure.<azure-service>.connection-string。 例如,將 spring.cloud.azure.eventhubs.connection-string 設定為連線到事件中樞服務。