託管於 Azure 之外的應用程式,例如在本地部署或第三方資料中心的應用程式,應透過
- 如何向 Microsoft Entra 註冊應用程式以建立服務主體。
- 如何為範圍權限指派角色。
- 如何透過應用程式程式碼中的服務主體來認證。
透過使用專用的應用程式服務主體,你可以在存取 Azure 資源時遵循最小權限原則。 在開發過程中,將權限限制在應用程式的特定需求,以防止誤入 Azure 資源,這些資源原本是用於其他應用程式或服務的。 這種做法也能避免在將應用程式移至生產環境時出現問題,確保應用程式在開發環境中不會被過度使用權限。
請在每個應用程式所部署的環境中,分別建立不同的應用程式註冊。 你可以為每個服務主體設定環境特定的資源權限,並確保部署到一個環境的應用程式不會存取另一個環境的 Azure 資源。
喺 Azure 註冊應用程式
應用程式服務主體物件是透過在 Azure 的應用程式註冊,使用 Azure 入口網站或 Azure CLI 來建立。
在Azure入口網站,使用搜尋欄導航至App registrations頁面。
在App registrations頁面,選擇+新註冊。
在 註冊應用程式 頁面上:
- 針對 [名稱] 字段,輸入包含應用程式名稱和目標環境的描述性值。
- 針對 支援的帳戶類型,請選取 僅限此組織目錄內的帳戶(僅限 Microsoft 客戶導向 - 單一租戶)或是最符合您需求的選項。
選取 [] 註冊 [] 以註冊您的應用程式並建立服務主體。
在應用程式的 [應用程式註冊] 頁面上,複製 應用程式識別碼 和 目錄(租使用者)標識碼 並貼到暫存位置,以供稍後在應用程式程式代碼組態中使用。
選取 [[新增憑證或秘密],以設定應用程式的認證。
在 [憑證 & 秘密] 頁面上,選取 [+ 新增客戶端密碼]。
在開啟的 [新增客戶端密碼 浮出視窗] 中:
- 對於描述,輸入一個值。
Current - 對於 過期 值,保留預設建議值
180 days。 - 選取 ,然後添加 以增加秘密。
- 對於描述,輸入一個值。
在 [憑證 & 秘密] 頁面上,複製用戶端密碼的 Value 屬性,以供日後步驟使用。
備註
客戶端密碼值只會在建立應用程式註冊之後顯示一次。 您可以新增更多客戶端密碼,而不會使此客戶端密碼失效,但無法再次顯示此值。
將角色指派給應用程式服務主體
接著,確定你的應用程式需要哪些角色(權限)和哪些資源,並將這些角色指派給你建立的服務主體。 角色可在資源、資源群組或訂閱範圍分配。 這個範例展示了如何在資源群組範圍內指派角色,因為大多數應用程式會將所有 Azure 資源分組到單一資源群組。
在Azure入口網站中,前往包含你應用程式的資源群組的 Overview頁面。
從左側導覽中選擇 存取控制(IAM)。
在 [存取控制 (IAM)] 頁面上,選取 [+ 新增],然後從下拉選單中選擇 [新增角色指派]。 新增 角色指派 頁面提供數個索引標籤來設定和指派角色。
在 [ 角色 ] 索引標籤上,使用搜尋方塊來尋找您要指派的角色。 選取角色,然後選擇 下一步。
在 「成員」 標籤上:
- 針對 [指派存取權] 值,選取 [使用者、群組或服務主體] 。
- 針對 [成員] 值,選擇 [+ 選取成員] 以開啟 [選取成員] 彈出面板。
- 搜尋你先前建立的服務主體,從篩選結果中選擇它。 選擇 選擇 以選擇群組,然後關閉彈出面板。
- 請在 成員 索引標籤的底部選取 檢閱 + 指派。
在 [ 檢閱 + 指派 ] 索引標籤上,選取頁面底部的 [ 檢閱 + 指派 ]。
設定應用程式環境變數
執行時,Azure身份函式庫中的某些憑證,如DefaultAzureCredential、EnvironmentCredential 和 ClientSecretCredential,依照慣例在環境變數中搜尋服務主體資訊。 使用 Java 時,你可以根據工具和環境,以多種方式配置環境變數。
無論您選擇何種方法,請為服務主體設定下列環境變數:
-
AZURE_CLIENT_ID:用於識別Azure中註冊的應用程式。 -
AZURE_TENANT_ID:Microsoft Entra 租戶的識別碼。 -
AZURE_CLIENT_SECRET:為應用程式產生的秘密認證。
設定下列環境變數。 將佔位符的數值替換成你應用程式註冊時的實際數值:
export AZURE_CLIENT_ID="<your-client-id>"
export AZURE_TENANT_ID="<your-tenant-id>"
export AZURE_CLIENT_SECRET="<your-client-secret>"
對於在生產伺服器上以 systemd 服務運行的 Java 應用程式,請在檔案中定義環境變數,並以服務單元檔案中的 EnvironmentFile 指令引用:
[Unit]
Description=Java application service
After=network.target
[Service]
User=app-user
WorkingDirectory=/path/to/java-app
EnvironmentFile=/path/to/java-app/app-environment-variables
ExecStart=/usr/bin/java -jar app.jar
[Install]
WantedBy=multi-user.target
環境檔案應包含環境變數及其值清單:
AZURE_CLIENT_ID=<your-client-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_SECRET=<your-client-secret>
從你的應用程式認證到 Azure 服務
Azure 身份函式庫提供各種 憑證——支援不同情境與Microsoft Entra認證流程的 TokenCredential實作。 以下步驟將展示如何在本地及生產環境中與服務主體合作時使用 ClientSecretCredential 。
實作程式碼
將 azure-identity 相依性加入你的 pom.xml 檔案。
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
</dependency>
你可以透過各種 Azure SDK 用戶端函式庫中的專門客戶端類別來存取 Azure 服務。 對於任何在應用程式中建立 Azure SDK 用戶端物件的 Java 程式碼,請遵循以下步驟:
- 從
com.azure.identity套件匯入ClientSecretCredentialBuilder類別。 - 使用
ClientSecretCredentialBuilder、tenantId、clientId和clientSecret來建立ClientSecretCredential物件。 - 將
ClientSecretCredential實例傳給 Azure SDK 用戶端物件建構器的credential方法。
以下程式碼段落展示了此方法的範例:
import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;
String tenantId = System.getenv("AZURE_TENANT_ID");
String clientId = System.getenv("AZURE_CLIENT_ID");
String clientSecret = System.getenv("AZURE_CLIENT_SECRET");
ClientSecretCredential credential = new ClientSecretCredentialBuilder()
.tenantId(tenantId)
.clientId(clientId)
.clientSecret(clientSecret)
.build();
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("https://<account-name>.blob.core.windows.net")
.credential(credential)
.buildClient();