使用 Microsoft Entra ID 驗證 Azure Batch 服務
Azure Batch 支援使用 Microsoft Entra ID、Microsoft 的多租用戶雲端式目錄,以及身分識別管理服務進行驗證。 Azure 會使用 Microsoft Entra ID 來驗證自己的客戶、服務管理員和組織使用者。
本文說明使用 Microsoft Entra 搭配 Azure Batch 進行驗證的兩種方式:
整合式驗證會驗證與應用程式互動的使用者。 應用程式會收集使用者的認證,並使用這些認證來驗證對 Batch 資源的存取權。
服務主體會驗證自動應用程式。 服務主體會定義應用程式的原則和權限,並代表應用程式在執行階段存取 Batch 資源。
如需 Microsoft Entra ID 的詳細資訊,請參閱 Microsoft Entra 文件。
取得用於驗證的端點
若要使用 Microsoft Entra ID 驗證 Batch 應用程式,您必須在程式碼中包含 Microsoft Entra 端點和 Batch 資源端點。
Microsoft Entra 端點
基礎 Microsoft Entra 授權單位端點為 https://login.microsoftonline.com/
。 若要使用 Microsoft Entra ID 進行驗證,請使用此端點搭配「租用戶識別碼」來識別用於驗證的 Microsoft Entra 租用戶:
https://login.microsoftonline.com/<tenant-id>
您可以從 Azure 入口網站中的主要 Microsoft Entra ID 頁面取得租用戶識別碼。 您也可以在左側導覽中選取 [屬性],並在 [屬性] 頁面上查看 [租用戶識別碼]。
重要
當您使用服務主體進行驗證時,將需要租用戶特定的 Microsoft Entra 端點。
當您使用整合式驗證進行驗證時,建議使用租用戶特定的端點,但不是強迫性。 您也可以使用 Microsoft Entra 通用端點,在未提供特定租用戶時提供一般認證收集介面。 通用端點為
https://login.microsoftonline.com/common
。
如需 Microsoft Entra 端點的詳細資訊,請參閱驗證與授權。
Batch 資源端點
使用 Batch 資源端點 https://batch.core.windows.net/
來取得權杖,以驗證對 Batch 服務的要求。
向租用戶註冊您的應用程式
使用 Microsoft Entra 驗證的第一個步驟是在 Microsoft Entra 租用戶中註冊您的應用程式。 註冊應用程式之後,您便可以從程式碼呼叫 Microsoft 驗證程式庫 (MSAL)。 MSAL 會提供 API,以便從您的應用程式使用 Microsoft Entra ID 進行驗證。 不論您是使用整合式驗證或服務主體,都需要註冊您的應用程式。
當您註冊應用程式時,便會向 Microsoft Entra ID 提供應用程式的相關資訊。 Microsoft Entra ID 接著會提供「應用程式識別碼」 (也稱為「用戶端識別碼」),讓您用於在執行階段將應用程式關聯至 Microsoft Entra。 如需應用程式識別碼的更多資訊,請參閱 Microsoft Entra ID 中的應用程式和服務主體物件。
若要註冊 Batch 應用程式,請遵循註冊應用程式的步驟。
註冊應用程式之後,您可以在應用程式的 [概觀] 頁面上看到 [應用程式 (用戶端) 識別碼]。
設定整合式驗證
若要使用整合式驗證進行驗證,您需要為應用程式授與權限,以連接到 Batch 服務 API。 此步驟可讓您的應用程式使用 Microsoft Entra ID 來驗證對 Batch 服務 API 的呼叫。
註冊應用程式之後,請遵循下列步驟,將 Batch 服務的存取權授與應用程式:
- 在 Azure 入口網站中,搜尋並選取 [應用程式註冊]。
- 在 [應用程式註冊] 頁面上選取您的應用程式。
- 在應用程式的頁面上,從左側導覽中選取 [API 權限]。
- 在 [API 權限] 頁面上,選取 [新增權限]。
- 在 [要求 API 權限] 頁面上,選取 [Azure Batch]。
- 在 [Azure Batch] 頁面上的 [選取權限] 底下,選取 user_impersonation 旁的核取方塊,然後選取 [新增權限]。
[API 權限] 頁面現在會顯示您的 Microsoft Entra 應用程式可以存取 Microsoft Graph 和 Azure Batch。 當您向 Microsoft Entra ID 註冊應用程式時,系統會自動將權限授與 Microsoft Graph。
設定服務主體
若要驗證自動執行的應用程式,您可以使用服務主體。 當您的應用程式使用服務主體進行驗證時,將會一併把應用程式識別碼和祕密金鑰傳送到 Microsoft Entra ID。
註冊您的應用程式之後,請在 Azure 入口網站中遵循下列步驟來設定服務主體:
- 要求應用程式的祕密。
- 將 Azure 角色型存取控制 (Azure RBAC) 指派給應用程式。
要求應用程式的祕密
請遵循下列步驟來建立和複製秘密金鑰,以便在您的程式碼中使用:
- 在 Azure 入口網站中,搜尋並選取 [應用程式註冊]。
- 在 [應用程式註冊] 頁面上選取您的應用程式。
- 在應用程式的頁面上,從左側導覽中選取 [憑證及秘密]。
- 在 [憑證及秘密] 頁面上,選取 [新增用戶端密碼]。
- 在 [新增用戶端密碼] 頁面上輸入描述,然後選取密碼的到期期間。
- 選取 [新增] 以建立密碼,並顯示在 [憑證及秘密] 頁面上。
- 將祕密值複製到安全的地方,因為離開此頁面後就無法再存取秘密值。 如果您遺失金鑰的存取權,可以產生新的金鑰。
將 Azure RBAC 指派給應用程式
請遵循下列步驟,將 Azure RBAC 角色指派給您的應用程式。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色。
- 在 Azure 入口網站中,瀏覽至應用程式使用的 Batch 帳戶。
- 從左側導覽列選取 [存取控制 (IAM)]。
- 在 [存取控制 (IAM)] 頁面上,選取 [新增角色指派]。
- 在 [新增角色指派] 頁面上,選取 [角色] 索引標籤,然後為您的應用程式選取 [參與者] 或 [讀者] 角色。
- 選取 [成員] 索引標籤,然後選取 [成員] 下的 [選取成員]。
- 在 [選取成員] 畫面上,搜尋並選取您的應用程式,然後選取 [選取]。
- 在 [新增角色指派] 頁面上選取 [檢閱 + 指派]。
現在您的應用程式應該會出現在 Batch 帳戶 [存取控制 (IAM)] 頁面的 [角色指派] 索引標籤上。
指派自訂角色
自訂角色將細微權限授與使用者,以提交作業、工作等等。 您可以使用自訂角色來防止使用者執行影響成本的作業,例如建立集區或修改節點。
您可以使用自訂角色,將下列 Azure Batch RBAC 作業的權限授與或封鎖 Microsoft Entra 使用者、群組或服務主體:
- Microsoft.Batch/batchAccounts/pools/write
- Microsoft.Batch/batchAccounts/pools/delete
- Microsoft.Batch/batchAccounts/pools/read
- Microsoft.Batch/batchAccounts/jobSchedules/write
- Microsoft.Batch/batchAccounts/jobSchedules/delete
- Microsoft.Batch/batchAccounts/jobSchedules/read
- Microsoft.Batch/batchAccounts/jobs/write
- Microsoft.Batch/batchAccounts/jobs/delete
- Microsoft.Batch/batchAccounts/jobs/read
- Microsoft.Batch/batchAccounts/certificates/write
- Microsoft.Batch/batchAccounts/certificates/delete
- Microsoft.Batch/batchAccounts/certificates/read
- Microsoft.Batch/batchAccounts/read,適用於任何讀取作業
- Microsoft.Batch/batchAccounts/listKeys/action,適用於任何作業
自訂角色適用於透過 Microsoft Entra ID 驗證的使用者,不適用於 Batch 共用金鑰帳戶認證。 Batch 帳戶認證會將完整權限授與 Batch 帳戶。 使用自動集區的工作需要集區層級權限。
注意
某些角色指派必須在 actions
欄位中指定,而其他角色指派則需要在 dataActions
欄位中指定。 如需詳細資訊,請參閱 Azure 資源提供者作業。
下列範例展示 Azure Batch 自訂角色定義:
{
"properties":{
"roleName":"Azure Batch Custom Job Submitter",
"type":"CustomRole",
"description":"Allows a user to submit jobs to Azure Batch but not manage pools",
"assignableScopes":[
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
],
"permissions":[
{
"actions":[
"Microsoft.Batch/*/read",
"Microsoft.Authorization/*/read",
"Microsoft.Resources/subscriptions/resourceGroups/read",
"Microsoft.Support/*",
"Microsoft.Insights/alertRules/*"
],
"notActions":[
],
"dataActions":[
"Microsoft.Batch/batchAccounts/jobs/*",
"Microsoft.Batch/batchAccounts/jobSchedules/*"
],
"notDataActions":[
]
}
]
}
}
如需建立自訂角色的詳細資訊,請參閱 Azure 自訂角色。
程式碼範例
本節中的程式碼範例示範如何使用整合式驗證或 Microsoft Entra ID 進行驗證,以及使用服務主體進行驗證。 此程式碼範例大部分會使用 .NET 和 Python,但概念與其他語言類似。
注意
Microsoft Entra 驗證權杖會在一小時後過期。 當您使用長期存在的 BatchClient 物件時,最好在每個要求上從 MSAL 取得權杖,以確保您始終具備有效的權杖。
若要在 .NET 中這麼做,請撰寫可從 Microsoft Entra ID 中擷取權杖的方法,並傳遞該方法至 BatchTokenCredentials 物件做為委派。 每個對 Batch 服務的要求都會呼叫此委派方法,以確保已提供有效的權杖。 根據預設,MSAL 會快取權杖,因此只在必要時才會從 Microsoft Entra 擷取新的權杖。 如需 Microsoft Entra ID 權杖的詳細資訊,請參閱安全性權杖。
程式碼範例︰搭配 Batch .NET 使用 Microsoft Entra 整合式驗證
若要使用 Batch .NET 的整合式驗證進行驗證:
安裝 Azure Batch .NET 和 MSAL NuGet 套件。
在您的程式碼中,宣告下列
using
陳述式:using Microsoft.Azure.Batch; using Microsoft.Azure.Batch.Auth; using Microsoft.Identity.Client;
參考 Microsoft Entra 端點,包括租用戶識別碼。 您可以從 Azure 入口網站中的 Microsoft Entra ID [概觀] 頁面取得租用戶識別碼。
private const string AuthorityUri = "https://login.microsoftonline.com/<tenant-id>";
參考 Batch 服務資源端點:
private const string BatchResourceUri = "https://batch.core.windows.net/";
參考您的 Batch 帳戶:
private const string BatchAccountUrl = "https://<myaccount>.<mylocation>.batch.azure.com";
指定您應用程式的應用程式 (用戶端) 識別碼。 您可以從 Azure 入口網站中的應用程式 [概觀] 頁面取得應用程式識別碼。
private const string ClientId = "<application-id>";
指定您在註冊應用程式時所提供的重新導向 URI。
private const string RedirectUri = "https://<redirect-uri>";
撰寫回呼方法,以從 Microsoft Entra ID 取得驗證權杖。 下列範例會呼叫 MSAL 來驗證與應用程式互動的使用者。 MSAL IConfidentialClientApplication.AcquireTokenByAuthorizationCode 方法會提示使用者輸入其認證。 一旦使用者提供認證,應用程式就會繼續執行。
authorizationCode 參數是在使用者驗證之後從授權伺服器取得的授權碼。
WithRedirectUri
會指定在驗證之後,授權伺服器用於重新導向使用者的重新導向 URI。public static async Task<string> GetTokenUsingAuthorizationCode(string authorizationCode, string redirectUri, string[] scopes) { var app = ConfidentialClientApplicationBuilder.Create(ClientId) .WithAuthority(AuthorityUri) .WithRedirectUri(RedirectUri) .Build(); var authResult = await app.AcquireTokenByAuthorizationCode(scopes, authorizationCode).ExecuteAsync(); return authResult.AccessToken; }
使用下列程式碼呼叫此方法,並將
<authorization-code>
取代為從授權伺服器取得的授權碼。.default
範圍可確保使用者有權存取資源的所有範圍。var token = await GetTokenUsingAuthorizationCode("<authorization-code>", "RedirectUri", new string[] { "BatchResourceUri/.default" });
建構接受委派做為參數的 BatchTokenCredentials 物件。 使用這些認證來開啟 BatchClient 物件。 然後針對 Batch 服務的後續作業使用該 BatchClient 物件:
public static void PerformBatchOperations() { Func<Task<string>> tokenProvider = () => GetTokenUsingAuthorizationCode(); using (var client = BatchClient.Open(new BatchTokenCredentials(BatchAccountUrl, tokenProvider))) { client.JobOperations.ListJobs(); } }
程式碼範例:搭配 Batch .NET 使用 Microsoft Entra 服務主體
若要透過 Batch .NET 的服務主體進行驗證:
安裝 Azure Batch .NET 和 MSAL NuGet 套件。
在您的程式碼中,宣告下列
using
陳述式:using Microsoft.Azure.Batch; using Microsoft.Azure.Batch.Auth; using Microsoft.Identity.Client;
參考 Microsoft Entra 端點,包括租用戶識別碼。 若使用服務主體,您必須提供租用戶特定的端點。 您可以從 Azure 入口網站中的 Microsoft Entra ID [概觀] 頁面取得租用戶識別碼。
private const string AuthorityUri = "https://login.microsoftonline.com/<tenant-id>";
參考 Batch 服務資源端點:
private const string BatchResourceUri = "https://batch.core.windows.net/";
參考您的 Batch 帳戶:
private const string BatchAccountUrl = "https://<myaccount>.<mylocation>.batch.azure.com";
指定您應用程式的應用程式 (用戶端) 識別碼。 您可以從 Azure 入口網站中的應用程式 [概觀] 頁面取得應用程式識別碼。
private const string ClientId = "<application-id>";
指定您從 Azure 入口網站中複製的祕密金鑰。
private const string ClientKey = "<secret-key>";
撰寫回呼方法,以從 Microsoft Entra ID 取得驗證權杖。 下列 ConfidentialClientApplicationBuilder.Create 方法會呼叫 MSAL 進行自動驗證。
public static async Task<string> GetAccessToken(string[] scopes) { var app = ConfidentialClientApplicationBuilder.Create(clientId) .WithClientSecret(ClientKey) .WithAuthority(new Uri(AuthorityUri)) .Build(); var result = await app.AcquireTokenForClient(scopes).ExecuteAsync(); return result.AccessToken; }
使用下列程式碼呼叫此方法。
.default
範圍可確保應用程式有權存取資源的所有範圍。var token = await GetAccessToken(new string[] { $"{BatchResourceUri}/.default" });
建構接受委派做為參數的 BatchTokenCredentials 物件。 使用這些認證來開啟 BatchClient 物件。 然後針對 Batch 服務的後續作業使用該 BatchClient 物件:
public static void PerformBatchOperations() { Func<Task<string>> tokenProvider = () => GetAccessToken(); using (var client = BatchClient.Open(new BatchTokenCredentials(BatchAccountUrl, tokenProvider))) { client.JobOperations.ListJobs(); } }
程式碼範例:搭配 Batch Python 使用 Microsoft Entra 服務主體
若要從 Batch Python 向服務主體進行驗證:
安裝 azure-batch 和 azure-common Python 模組。
參考模組:
from azure.batch import BatchServiceClient from azure.common.credentials import ServicePrincipalCredentials
若要使用服務主體,請提供租用戶特定的端點。 您可以從 Azure 入口網站的 Microsoft Entra ID [概觀] 頁面或 [屬性] 頁面取得租用戶識別碼。
TENANT_ID = "<tenant-id>"
參考 Batch 服務資源端點:
RESOURCE = "https://batch.core.windows.net/"
參考您的 Batch 帳戶:
BATCH_ACCOUNT_URL = "https://<myaccount>.<mylocation>.batch.azure.com"
指定您應用程式的應用程式 (用戶端) 識別碼。 您可以從 Azure 入口網站中的應用程式 [概觀] 頁面取得應用程式識別碼。
CLIENT_ID = "<application-id>"
指定您從 Azure 入口網站中複製的祕密金鑰:
SECRET = "<secret-key>"
建立 ServicePrincipalCredentials 物件:
credentials = ServicePrincipalCredentials( client_id=CLIENT_ID, secret=SECRET, tenant=TENANT_ID, resource=RESOURCE )
使用服務主體認證來開啟 BatchServiceClient 物件。 接著,針對 Batch 服務的後續作業使用該 BatchServiceClient 物件。
batch_client = BatchServiceClient( credentials, batch_url=BATCH_ACCOUNT_URL )
如需如何建立 Batch 用戶端 (使用 Microsoft Entra 權杖進行驗證) 的 Python 範例,請參閱使用 Python 指令碼部署 Azure Batch 自訂映像範例。