使用 Azure Pipelines 部署自訂原則

Azure Pipelines 支援持續整合 (CI) 與持續傳遞 (CD),以持續且一致地測試、建置程式碼,然後將其傳送至任何目標。 本文描述如何使用 Azure Pipelines,將 Azure Active Directory B2C (Azure AD B2C) 自訂原則的部署流程自動化。

重要

使用 Azure Pipelines 管理 Azure AD B2C 自訂原則,目前會使用 Microsoft Graph API /beta 端點上提供的預覽作業。 不支援在生產應用程式中使用這些 API。 如需詳細資訊,請參閱 Microsoft Graph REST API 搶鮮版 (Beta) 端點參考

必要條件

為管理工作註冊一個應用程式

您可以使用 PowerShell 指令碼來部署 Azure AD B2C 原則。 在 PowerShell 指令碼可以與 Microsoft Graph API 互動之前,請先在您的 Azure AD B2C 租用戶中建立應用程式註冊。 如果您尚未這麼做,請註冊 Microsoft Graph 應用程式

若要讓 PowerShell 指令碼存取 MS Graph 中的資料,請將相關的應用程式權限授與已註冊的應用程式。 已將應用程式註冊 API 權限內的 >Policy>Policy.ReadWrite.TrustFramework 權限授與 Microsoft Graph

設定 Azure 存放庫

註冊了 Microsoft Graph 應用程式後,您就可以為原則檔案設定存放庫。

  1. 登入您的 Azure DevOps 組織
  2. 建立新的專案,或選取現有的專案。
  3. 在您的專案中,瀏覽至 [存放庫],然後選取 [檔案]。
  4. 選取現有的存放庫或建立一個。
  5. 在您存放庫的根目錄中,建立名為 B2CAssets 的資料夾。 將您的 Azure AD B2C 自訂原則檔案新增至 B2CAssets 資料夾。
  6. 在您存放庫的根目錄中,建立名為 Scripts 的資料夾。 建立 PowerShell 檔案 DeployToB2C.ps1。 將下列 PowerShell 指令碼貼入 DeployToB2C.ps1 中。
  7. 認可推送變更。

下列腳本會從Microsoft Entra識別碼取得存取權杖。 有了權杖,指令碼會呼叫 MS Graph API,以上傳 B2CAssets 資料夾中的原則。 您也可以在上傳原則之前變更其內容。 例如,將 tenant-name.onmicrosoft.com 取代為您的租用戶名稱。

[Cmdletbinding()]
Param(
    [Parameter(Mandatory = $true)][string]$ClientID,
    [Parameter(Mandatory = $true)][string]$ClientSecret,
    [Parameter(Mandatory = $true)][string]$TenantId,
    [Parameter(Mandatory = $true)][string]$Folder,
    [Parameter(Mandatory = $true)][string]$Files
)

try {
    $body = @{grant_type = "client_credentials"; scope = "https://graph.microsoft.com/.default"; client_id = $ClientID; client_secret = $ClientSecret }

    $response = Invoke-RestMethod -Uri https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token -Method Post -Body $body
    $token = $response.access_token

    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("Content-Type", 'application/xml')
    $headers.Add("Authorization", 'Bearer ' + $token)

    # Get the list of files to upload
    $filesArray = $Files.Split(",")

    Foreach ($file in $filesArray) {

        $filePath = $Folder + $file.Trim()

        # Check if file exists
        $FileExists = Test-Path -Path $filePath -PathType Leaf

        if ($FileExists) {
            $policycontent = Get-Content $filePath -Encoding UTF8

            # Optional: Change the content of the policy. For example, replace the tenant-name with your tenant name.
            # $policycontent = $policycontent.Replace("your-tenant.onmicrosoft.com", "contoso.onmicrosoft.com")     
    
    
            # Get the policy name from the XML document
            $match = Select-String -InputObject $policycontent  -Pattern '(?<=\bPolicyId=")[^"]*'
    
            If ($match.matches.groups.count -ge 1) {
                $PolicyId = $match.matches.groups[0].value
    
                Write-Host "Uploading the" $PolicyId "policy..."
    
                $graphuri = 'https://graph.microsoft.com/beta/trustframework/policies/' + $PolicyId + '/$value'
                $content = [System.Text.Encoding]::UTF8.GetBytes($policycontent)
                $response = Invoke-RestMethod -Uri $graphuri -Method Put -Body $content -Headers $headers -ContentType "application/xml; charset=utf-8"
    
                Write-Host "Policy" $PolicyId "uploaded successfully."
            }
        }
        else {
            $warning = "File " + $filePath + " couldn't be not found."
            Write-Warning -Message $warning
        }
    }
}
catch {
    Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__

    $_

    $streamReader = [System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream())
    $streamReader.BaseStream.Position = 0
    $streamReader.DiscardBufferedData()
    $errResp = $streamReader.ReadToEnd()
    $streamReader.Close()

    $ErrResp

    exit 1
}

exit 0

設定 Azure Pipelines

當您的存放庫初始化並填入您的自訂原則檔案時,您就可以開始設定發行管線。 若要建立管線,請遵循下列步驟:

  1. 在您的專案中,選取 [管線]>[發行]>[新增管線]。
  2. 在 [選取範本] 下,選取 [空白作業],然後選取 [套用]。
  3. 輸入階段名稱 (例如 DeployCustomPolicies),然後關閉窗格。
  4. 選取 [新增成品],然後在 [來源類型] 下選取 [ Azure 存放庫]。
    1. 針對 [專案],選取您的專案。
    2. 選取包含 Scripts 資料夾的 [來源 (存放庫)]。
    3. 選取 [預設分支],例如 master
    4. 保留「來自預設分支的最新項目」的 [預設版本] 設定。
    5. 輸入存放庫的 [來源別名]。 例如,policyRepo
  5. 選取 [新增]
  6. 重新命名管線以反映其意圖。 例如,「部署自訂原則管線」。
  7. 選取 [儲存],以儲存管線設定。

設定管線變數

管線變數提供您一種便利方式,將資料的金鑰位元放入管線的各個部分。 下列變數提供 Azure AD B2C 環境的相關資訊。

Name
clientId 您稍早所註冊應用程式的應用程式 (用戶端) 識別碼
clientSecret 您稍早建立的用戶端密碼值。
將變數類型變更為 [秘密] (選取鎖定圖示)。
tenantId your-b2c-tenant.onmicrosoft.com,其中 your-b2c-tenant 是 Azure AD b2c 租用戶的名稱。

若要新增管線變數,請遵循下列步驟:

  1. 在您的管線中,選取 [變數] 索引標籤。
  2. 在 [管線變數] 下,新增上述變數及其值。
  3. 選取 [儲存] 以儲存變數。

新增管線工作

管線工作是執行動作的預先封裝指令碼。 新增一個工作,呼叫 DeployToB2C.ps1 PowerShell 指令碼。

  1. 在您建立的管線中,選取 [工作] 索引標籤。

  2. 選取 [代理程式作業],然後選取加號 (+) 將工作新增至代理程式作業。

  3. 搜尋並選取 [PowerShell]。 請不要選取「Azure PowerShell」、「目標電腦上的 PowerShell」或另一個 PowerShell 項目。

  4. 選取新增的 [PowerShell 指令碼] 工作。

  5. 針對 PowerShell 指令碼工作輸入下列值:

    • 工作版本:2.*

    • 顯示名稱:此工作應該上傳的原則名稱。 例如,B2C_1A_TrustFrameworkBase

    • 類型:檔案路徑

    • 指令碼路徑:選取省略號 (...)、瀏覽至 Scripts 資料夾,然後選取 DeployToB2C.ps1 檔案。

    • 引數:輸入下列 PowerShell 指令碼。

      -ClientID $(clientId) -ClientSecret $(clientSecret) -TenantId $(tenantId) -Folder $(System.DefaultWorkingDirectory)/policyRepo/B2CAssets/ -Files "TrustFrameworkBase.xml,TrustFrameworkLocalization.xml,TrustFrameworkExtensions.xml,SignUpOrSignin.xml,ProfileEdit.xml,PasswordReset.xml"
      

      -Files 參數是逗號分隔清單,列出要部署的原則檔案。 更新具有您原則檔案的清單。

      重要

      請確定以正確的順序上傳原則。 首先是基礎原則、接著是延伸原則,然後是信賴憑證者原則。 例如: TrustFrameworkBase.xml,TrustFrameworkLocalization.xml,TrustFrameworkExtensions.xml,SignUpOrSignin.xml

  6. 選取 [儲存] 以儲存代理程式作業。

測試您的管線

若要測試您的發行管線:

  1. 選取 [管線],然後選取 [發行]。
  2. 選取您稍早建立的管線,例如 DeployCustomPolicies
  3. 選取 [建立發行],然後選取 [建立] 以將發行排入佇列。

您應該會看到通知橫幅,指出發行已排入佇列。 若要檢視其狀態,請選取通知橫幅中的連結,或在 [發行] 索引標籤上的清單中選取該連結。

後續步驟

深入了解: