次の方法で共有


Azure Pipelines を使用してカスタム ポリシーをデプロイする

Von Bedeutung

2025 年 5 月 1 日より、Azure AD B2C は新規のお客様向けに購入できなくなります。 詳細については、FAQ を参照してください

Azure Pipelines は、継続的インテグレーション (CI) と継続的デリバリー (CD) をサポートしており、コードを任意のターゲットに継続的かつ一貫してテスト、ビルド、出荷できます。 この記事では、Azure Pipelines を使用して Azure Active Directory B2C (Azure AD B2C) カスタム ポリシー のデプロイ プロセスを自動化する方法について説明します。

Von Bedeutung

Azure Pipelines を使用して Azure AD B2C カスタム ポリシーを管理する場合、現在、Microsoft Graph API エンドポイントで使用できる/beta操作が使用されています。 実稼働アプリケーションでこれらの API を使用することは、サポートされていません。 詳細については、 Microsoft Graph REST API ベータ エンドポイント リファレンスを参照してください

[前提条件]

管理タスク用のアプリケーションの登録

PowerShell スクリプトを使用して、Azure AD B2C ポリシーをデプロイします。 PowerShell スクリプトが Microsoft Graph API と対話する前に、Azure AD B2C テナントでアプリケーション登録を作成します。 まだ行っていない場合は、 Microsoft Graph アプリケーションを登録します。

PowerShell スクリプトが MS Graph のデータにアクセスするには、登録済みのアプリケーションに関連する アプリケーションのアクセス許可を付与します。 アプリ登録の API アクセス許可内で >>Policy.ReadWrite.TrustFramework アクセス許可を付与しました。

Azure リポジトリを構成する

Microsoft Graph アプリケーションを登録すると、ポリシー ファイルのリポジトリを構成する準備が整います。

  1. Azure DevOps 組織にサインインします。
  2. 新しいプロジェクトを作成するか、既存のプロジェクトを選択します。
  3. プロジェクトで [Repos] に移動し、[ ファイル] を選択します。
  4. 既存のリポジトリを選択するか、リポジトリを作成します。
  5. リポジトリのルート ディレクトリに、 B2CAssets という名前のフォルダを作成します。 Azure AD B2C カスタム ポリシー ファイルを B2CAssets フォルダーに追加します。
  6. リポジトリのルート ディレクトリに、 Scripts という名前のフォルダを作成します。 PowerShell ファイル をDeployToB2C.ps1で作成します。 次の PowerShell スクリプトを DeployToB2C.ps1に貼り付けます。
  7. 変更をコミットしてプッシュします。

次のスクリプトは、Microsoft Entra ID からアクセス トークンを取得します。 トークンを使用して、スクリプトは 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. プロジェクトで、 [Pipelines>Releases>New pipeline] を選択します。
  2. [テンプレートの選択] で [空のジョブ] を選択し、[適用] を選択します。
  3. ステージ名 (DeployCustomPolicies など) を入力し、ペインを閉じます。
  4. [成果物の追加] を選択し、 [ソースの種類] で [Azure リポジトリ] を選択します。
    1. [プロジェクト] で、プロジェクトを選択します。
    2. Scripts フォルダを含む Source (リポジトリ) を選択します。
    3. [デフォルト] ブランチ (master など) を選択します。
    4. 既定のブランチの [既定のバージョン] 設定を [最新] のままにします。
    5. リポジトリの [ソース エイリアス ] を入力します。 たとえば、「 policyRepo 」のように入力します。
  5. 追加を選択する
  6. パイプラインの名前をその意図を反映するように変更します。 たとえば、 Deploy Custom Policy Pipeline などです。
  7. [保存] を選択して、パイプライン構成を保存します。

パイプライン変数を構成する

パイプライン変数は、パイプラインのさまざまな部分にデータの主要なビットを取り込む便利な方法を提供します。 次の変数は、Azure AD B2C 環境に関する情報を提供します。

名前 価値
clientId 以前に登録したアプリケーションのアプリケーション (クライアント) ID
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です。

    • タイプ: ファイルパス

    • スクリプト パス: 省略記号 (...) を選択し、 スクリプト フォルダーに移動して、 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 パラメータは、デプロイするポリシーファイルのカンマ区切りリストです。 ポリシーファイルでリストを更新します。

      Von Bedeutung

      ポリシーが正しい順序でアップロードされていることを確認します。 最初に基本ポリシー、拡張ポリシー、次に証明書利用者ポリシーです。 たとえば、TrustFrameworkBase.xml,TrustFrameworkLocalization.xml,TrustFrameworkExtensions.xml,SignUpOrSignin.xml のようにします。

  6. [保存] を選択して、エージェント ジョブを保存します。

パイプラインをテストする

リリース パイプラインをテストするには:

  1. [パイプライン] を選択し、[リリース] を選択します。
  2. 前に作成したパイプライン ( DeployCustomPolicies など) を選択します。
  3. [リリースの作成] を選択し、[作成] を選択してリリースをキューに入れます。

リリースがキューに入れられたことを示す通知バナーが表示されます。 そのステータスを表示するには、通知バナーのリンクを選択するか、[ リリース] タブのリストでリンクを選択します。

次のステップ

詳細については、以下をご覧ください。