託管於 Azure 外部的應用程式,例如本地部署或第三方資料中心,應透過 Microsoft Entra ID 的應用程式服務主體來認證 Azure 服務。 在前面的章節中,您將學習:
- 如何使用 Microsoft Entra 註冊應用程式,以建立服務主體
- 如何將角色指派給權限範圍
- 如何從應用程式程式代碼使用服務主體進行驗證
使用專用的應用程式服務主體可讓您遵守存取 Azure 資源時的最低許可權原則。 許可權僅限於開發期間應用程式的特定需求,以防止意外存取適用於其他應用程式或服務的 Azure 資源。 這種方法也有助於避免當應用程式移至生產環境時發生問題,確保應用程式在開發環境中不會被過度授予權限。
應該為裝載應用程式所在的每個環境建立不同的應用程式註冊。 這允許為每個服務主體設定特定環境的資源權限,並確保部署到一個環境的應用程式不會與另一個環境中的 Azure 資源通訊。
在 Azure 中註冊應用程式
應用程式服務主體物件可以透過使用 Azure 入口網站或 Azure CLI,在 Azure 中註冊應用程式時所建立。
在 Azure 入口網站中,使用搜尋列流覽至 [應用程式註冊] 頁面。
在 [應用程式註冊] 頁面上,選取 [+ 新增註冊]。
在 註冊應用程式 頁面上:
- 針對 [名稱] 字段,輸入包含應用程式名稱和目標環境的描述性值。
- 針對 支援的帳戶類型,請選取 僅限此組織目錄內的帳戶(僅限 Microsoft 客戶導向 - 單一租戶)或是最符合您需求的選項。
選取 [] 註冊 [] 以註冊您的應用程式並建立服務主體。
在應用程式的 [應用程式註冊] 頁面上,複製 應用程式識別碼 和 目錄(租使用者)標識碼 並貼到暫存位置,以供稍後在應用程式程式代碼組態中使用。
選取 [[新增憑證或秘密],以設定應用程式的認證。
在 [憑證 & 秘密] 頁面上,選取 [+ 新增客戶端密碼]。
在開啟的 [新增客戶端密碼 浮出視窗] 中:
- 對於描述,輸入一個值。
Current - 對於 過期 值,保留預設建議值
180 days。 - 選取 [新增] 新增祕密。
- 對於描述,輸入一個值。
在 [憑證 & 秘密] 頁面上,複製用戶端密碼的 Value 屬性,以供日後步驟使用。
備註
客戶端密碼值只會在建立應用程式註冊之後顯示一次。 您可以新增更多客戶端密碼,而不會使此客戶端密碼失效,但無法再次顯示此值。
將角色指派給應用程式服務主體
接著,確定你的應用程式需要哪些角色(權限)和哪些資源,並將這些角色指派給你建立的服務主體。 角色可在資源、資源群組或訂閱範圍分配。 此範例示範如何在資源群組範圍指派角色,因為大部分的應用程式都會將其所有 Azure 資源分組到單一資源群組中。
在 Azure 入口網站中,流覽至包含應用程式之資源群組的 [ 概觀 ] 頁面。
從左側導覽中選擇 存取控制(IAM)。
在 [存取控制 (IAM)] 頁面上,選取 [+ 新增],然後從下拉選單中選擇 [新增角色指派]。 新增 角色指派 頁面提供數個索引標籤來設定和指派角色。
在 [ 角色 ] 索引標籤上,使用搜尋方塊來尋找您要指派的角色。 選取角色,然後選擇 下一步。
在 「成員」 標籤上:
- 針對 [指派存取權] 值,選取 [使用者、群組或服務主體] 。
- 針對 [成員] 值,選擇 [+ 選取成員] 以開啟 [選取成員] 彈出面板。
- 搜尋你先前建立的服務主體,從篩選結果中選擇它。 選擇 選擇 以選擇群組,然後關閉彈出面板。
- 請在 成員 索引標籤的底部選取 檢閱 + 指派。
在 [ 檢閱 + 指派 ] 索引標籤上,選取頁面底部的 [ 檢閱 + 指派 ]。
設定應用程式環境變數
在執行時,來自 Azure 身份識別庫的特定憑證,例如 DefaultAzureCredential、 EnvironmentCredential和 ClientSecretCredential,依慣例會在環境變數中搜尋服務主體資訊。 根據你的工具和環境,使用 JavaScript 有多種設定環境變數的方法。
無論您選擇何種方法,請為服務主體設定下列環境變數:
-
AZURE_CLIENT_ID:用來識別 Azure 中已註冊的應用程式。 -
AZURE_TENANT_ID:Microsoft Entra 租用戶的識別碼。 -
AZURE_CLIENT_SECRET:為應用程式產生的秘密認證。
在 Visual Studio Code 中,環境變數可以在專案的 launch.json 檔案中設定。 這些值會在應用程式啟動時自動提取。 不過,這些設定不會在部署期間隨您的應用程式一起移動,因此您必須在目標裝載環境上設定環境變數。
"configurations": [
{
"env": {
"NODE_ENV": "development",
"AZURE_CLIENT_ID": "<your-client-id>",
"AZURE_TENANT_ID":"<your-tenant-id>",
"AZURE_CLIENT_SECRET": "<your-client-secret>"
}
}
從您的應用程式向 Azure 服務進行驗證
Azure 身分識別程式庫 提供各種 認證的實作,以支援不同的情境和 Microsoft Entra 驗證流程。 接下來的步驟將示範如何在本地及生產環境中與服務主體合作時使用 ClientSecretCredential 。
實作程序代碼
在 Node.js 專案中加入 @azure/身份 套件:
npm install @azure/identity
Azure 服務是使用來自各種 Azure SDK 用戶端連結庫的特殊客戶端類別來存取。 對於任何在應用程式中建立 Azure SDK 客戶端物件的 JavaScript 程式碼,請依照以下步驟操作:
- 從模組匯入
ClientSecretCredential@azure/identity類別。 - 建立
ClientSecretCredential一個包含tenantId、clientId、clientSecret的物件。 - 將實
ClientSecretCredential例傳給 Azure SDK 客戶端物件建構器。
以下程式碼段落展示了此方法的範例:
import { BlobServiceClient } from '@azure/storage-blob';
import { ClientSecretCredential } from '@azure/identity';
// Authentication
const tenantId = process.env.AZURE_TENANT_ID;
const clientId = process.env.AZURE_CLIENT_ID;
const clientSecret = process.env.AZURE_CLIENT_SECRET;
// Azure Storage account name
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
if (!tenantId || !clientId || !clientSecret || !accountName) {
throw Error('Required environment variables not found');
}
const credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
const blobServiceClient = new BlobServiceClient(
`https://${accountName}.blob.core.windows.net`,
credential
);
另一種方法是直接將物件傳 ClientSecretCredential 給 Azure SDK 客戶端建構子:
const blobServiceClient = new BlobServiceClient(
`https://${accountName}.blob.core.windows.net`,
new ClientSecretCredential(tenantId, clientId, clientSecret)
);