Spring Cloud Azure 驗證
本文適用於:✅ 4.19.0 ✅ 5.19.0 版
本文說明所有 Spring Cloud Azure 驗證方法。
DefaultAzureCredential
DefaultAzureCredential
適用於大部分應用程式打算在 Azure 雲端中執行的情況。 這是因為 DefaultAzureCredential
結合在部署時常用來驗證的認證,以及用來在開發環境中進行驗證的認證。
注意
DefaultAzureCredential
旨在藉由處理具有合理默認行為的常見案例,來簡化開始使用 SDK。 如果您想要更多控制或您的案例未由預設設定提供,您應該使用其他認證類型。
DefaultAzureCredential
會嘗試透過下列機制進行驗證,以便:
- 環境 -
DefaultAzureCredential
會讀取透過環境變數指定的帳戶資訊,並使用它進行驗證。 - 受控識別 - 如果應用程式部署至已啟用受控識別的 Azure 主機,則
DefaultAzureCredential
會使用該帳戶進行驗證。 - IntelliJ - 如果您已透過適用於 IntelliJ 的 Azure 工具組進行驗證,則
DefaultAzureCredential
會使用該帳戶進行驗證。 - Visual Studio Code - 如果您已透過 Visual Studio Code Azure 帳戶外掛程式進行驗證,則
DefaultAzureCredential
會使用該帳戶進行驗證。 - Azure CLI - 如果您已透過 Azure CLI
az login
命令驗證帳戶,DefaultAzureCredential
會使用該帳戶進行驗證。
提示
請確定安全性主體已獲得足夠的許可權來存取 Azure 資源。 如需詳細資訊,請參閱 使用 Microsoft Entra ID授權存取權。
注意
由於 Spring Cloud Azure AutoConfigure 4.1.0,預設會自動註冊名為 springCloudAzureCredentialTaskExecutor
的 ThreadPoolTaskExecutor
豆,並管理 Azure 身分識別所建立的所有線程。 這個線程集區所管理的每個線程名稱前面都會加上 az-identity-
。 這個 ThreadPoolTaskExecutor
豆與 Spring Boot 所提供的 Executor
豆無關。
受控識別
常見的挑戰是管理用來保護組成解決方案之不同元件之間通訊的秘密和認證。 受控識別不需要管理認證。 受控識別提供身分識別,讓應用程式在連線到支援Microsoft Entra 驗證的資源時使用。 應用程式可以使用受控識別來取得Microsoft Entra 令牌。 例如,應用程式可能會使用受控識別來存取 Azure Key Vault 之類的資源,您可以在其中以安全的方式儲存認證,或存取記憶體帳戶。
我們鼓勵使用受控識別,而不是在應用程式中使用連接字串或密鑰,因為它更安全,而且會節省管理秘密和認證的麻煩。 在此情況下,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 識別符,您可以使用 Azure 角色型存取控制 (Azure RBAC) 將權限授與安全性主體,這可能是使用者或應用程式服務主體。 當安全性主體(使用者或應用程式)嘗試存取 Azure 資源時,例如事件中樞資源,必須授權要求。 使用 Microsoft Entra 識別符時,資源的存取是兩個步驟的程式:
- 首先,會驗證安全性主體的身分識別,並傳回 OAuth 2.0 令牌。
- 接下來,令牌會當做要求傳遞至 Azure 服務的一部分,以授權存取指定的資源。
使用 Microsoft Entra 識別碼進行驗證
若要將應用程式連線到支援 Microsoft Entra 驗證的資源,您可以使用前置詞 spring.cloud.azure.credential
或 spring.cloud.azure.<azure-service>.credential
來設定下列設定
下表列出驗證屬性:
財產 | 描述 |
---|---|
client-id | 使用 Azure 執行服務主體驗證時要使用的用戶端識別碼。 |
client-secret | 使用 Azure 執行服務主體驗證時要使用的客戶端密碼。 |
client-certificate-path | 使用 Azure 執行服務主體驗證時要使用的 PEM 憑證檔案路徑。 |
client-certificate-password | 憑證檔案的密碼。 |
username | 使用 Azure 執行使用者名稱/密碼驗證時要使用的用戶名稱。 |
密碼 | 使用 Azure 執行使用者名稱/密碼驗證時要使用的密碼。 |
已啟用 managed-identity-enabled | 是否要啟用受控識別。 |
提示
如需所有 Spring Cloud Azure 組態屬性的清單,請參閱 Spring Cloud Azure 組態屬性。
應用程式會尋找數個位置來尋找可用的認證,如果未設定認證屬性,則會使用 DefaultAzureCredential
。 如果您想要使用特定認證,請參閱下列範例以取得指引。
下列範例示範如何使用系統指派的受控識別進行驗證:
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}
下列範例示範如何使用不同的服務主體向 Key Vault 進行驗證。 此範例會使用兩個認證來設定應用程式:一個系統指派的受控識別和一個服務主體。 Key Vault 秘密用戶端會使用服務主體,但任何其他元件將會改用受控識別。
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 取得事件中樞、服務總線和記憶體佇列的連接字串,或 Cache for Redis 的屬性時,請指派 Azure 內建角色 Contributor
。 Azure Cache for Redis 很特別,您也可以指派 Redis Cache Contributor
角色以取得 Redis 屬性。
注意
Key Vault 存取原則會決定指定的安全性主體,也就是使用者、應用程式或使用者群組,是否可以在 Key Vault 秘密、金鑰和憑證上執行不同的作業。 您可以使用 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
向記憶體 Blob 服務進行驗證。
連接字串
某些 Azure 服務支援連接字串,以提供連線資訊和認證。 若要使用連接字串連線到這些 Azure 服務,只需設定 spring.cloud.azure.<azure-service>.connection-string
。 例如,將 spring.cloud.azure.eventhubs.connection-string
設定為連線到事件中樞服務。