mcpField
E
experience-ui-bundle-mfa-configure

experience-ui-bundle-mfa-configure

github.com/forcedotcomセキュリティ1.1k2.6k 回インストール1 日前に更新
リポジトリ

experience-ui-bundle-mfa-configure について

Salesforce Experience Site のコミュニティユーザーに MFA を設定するためのスキルです。権限セットのデプロイと割り当て、ログインフローの確認、MFA を妨げるサイト設定の調査を行います。

主な機能

  1. 01MFA と API 権限セットのデプロイ
  2. 02コミュニティユーザーへの権限セット割り当て
  3. 03ネットワークメンバーシップとゲスト Apex アクセスの確認
  4. 04MFA ログインチャレンジのトラブルシューティング
  5. 05ログインページのブランディング設定

活用シーン

  1. 01Experience Site ユーザーへの MFA 有効化
  2. 02ログイン時の MFA チャレンジ確認
  3. 03サイトログインや MFA 未表示のトラブルシューティング

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/forcedotcom/sf-skills --skill experience-ui-bundle-mfa-configure

インストール後、Claude Code で/experience-ui-bundle-mfa-configureを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
API_Enabled_For_Community.permissionset-meta.xml
MFA_Required_For_Community.permissionset-meta.xml
references/
branding.md
setup.md
social-login.md

詳細

Experience サイトで MFA を有効にする

適切な権限セットをデプロイし、プラットフォームが処理する MFA チャレンジフローを確認して、Experience サイト(Community)ユーザーに多要素認証を有効にします。

対象範囲

対象範囲:

  • コミュニティユーザー向けに ForceTwoFactor 権限セットをデプロイする
  • ApiEnabled 権限セットをデプロイする(ログイン後の API 呼び出しに必要)
  • コミュニティユーザーに権限セットを割り当てる
  • ログイン時に MFA が表示されない場合のトラブルシューティング
  • NetworkBranding メタデータを使用して MFA/ログインページのブランディングをカスタマイズする

対象範囲外 — 別のスキルに委任してください:

  • カスタムログイン UI の構築 → experience-ui-bundle-frontend-generate
  • 汎用権限セットの作成 → platform-permission-set-generate
  • 権限セットの割り当て(すでにデプロイ済みの場合)→ dx-org-permission-set-assign
  • メタデータの組織へのデプロイ → platform-metadata-deploy
  • Salesforce 内部ユーザー向けの組織全体の MFA → Setup > Identity Verification(スキルはありません)

前提条件

このスキルを使用する前に、以下がすでに整っていることを確認してください。

前提条件理由
Experience Cloud サイトがデプロイ済みで、有効になっているMFA はコミュニティへのログインに適用されます。サイトがなければ、保護するログインフローもありません
コミュニティユーザーが存在する(またはセルフ登録する)権限セットはコミュニティユーザーに割り当てます。サイトにはコミュニティ対応プロファイルが必要です
Customer Community または Customer Community Login ライセンスが有効になっているコミュニティユーザープロファイルに必要です。これがないと、ユーザーの作成とプロファイルのデプロイに失敗します
Network/Site が少なくとも一度公開されているログインと MFA チャレンジを表示するには、サイトの URL にアクセスできる必要があります

注: このスキルでは、組織の設定、ライセンスのプロビジョニング、Experience Cloud サイトの作成は扱いません。これらの前提条件が満たされていない場合は、まず Setup > Digital Experiences > All Sites > New から設定するか、サイトのベースアプリバンドルをデプロイしてください。


必要な入力

作業を開始する前に、以下を確認してください。

入力確認方法
対象組織sf CLI コマンドで使用する組織エイリアス
サイト名Experience サイト(Network)の名前 — SELECT Id, Name FROM Network を実行して確認します(Step 1 を参照)。これはサイト/Network の名前であり、uiBundles/ のアプリ名ではありません
コミュニティユーザーMFA を割り当てるユーザーまたはプロファイル

重要なドメイン知識

以下の事実は直感的に理解しにくく、混乱の原因になることがよくあります。

事実詳細
カスタム UI は不要プラットフォームが MFA チャレンジページを表示するため、React/LWC コンポーネントは不要です
ForceTwoFactor 権限ログイン時にコミュニティユーザーへ MFA を強制する唯一の方法です
組織の Identity Verification チェックボックスコミュニティ/ポータルユーザーには MFA を強制しません。内部ユーザーのみが対象です
vforcesite ドメインMFA チャレンジページは常に基盤となる Force.com Site ドメインから配信されます。これは想定どおりです
必ず ApiEnabled をデプロイするReact Experience サイトはログイン後に REST/Connect API 呼び出し(sdk.graphql、sdk.fetch)を行います。ApiEnabled がないと、これらは API_DISABLED_FOR_ORG エラーで失敗します
ソーシャルログイン/SSO は MFA とは別ですReact サイトでは、組み込みの Social Login コンポーネント(264 でリリース)を介して、設定済みの Auth Providers が表示されます。これは MFA 権限セットではなく、Auth Provider の設定によって制御されます。references/social-login.md を参照してください。
ログインページのブランディングは React サイトでも機能します264 以降、Site Containers の Setup に NetworkBranding の「Login & Registration」セクションが表示されるため、UI でロゴ/色/フッターをカスタマイズできます。Metadata API も引き続き使用できます。

ワークフロー

ステップ 1:対象サイトを特定する(ネットワーク)

これらは React Experience サイトであるため、両方の権限セットを必ずデプロイします — ForceTwoFactor(MFA を強制)と ApiEnabled(React サイトはログイン後に API 呼び出しを行います)。

組織から Experience サイトの実際の名前と ID を特定してください。uiBundles/ のアプリフォルダー名をサイト名と決めつけないでください。両者は異なることがよくあります。また、サイト名はローカルプロジェクトではなく、デプロイ先である組織から取得する必要があります。 以下の <site-name> と <NETWORK_ID> はここで取得します。

sf data query --target-org <org-alias> \
  --query "SELECT Id, Name FROM Network" --json
  • サイトが 1 つの場合 → その Name を <site-name>、Id を <NETWORK_ID> として使用します。
  • サイトが複数ある場合 → 名前を提示して、ユーザーにどのサイトを使うか尋ねます。
  • サイトが 0 件の場合 → サイトはまだデプロイされていません。処理を中止し、ユーザーに伝えます(「前提条件」を参照)。
ステップ 2:権限セットファイルを生成する

まず、プロジェクトのソースディレクトリを特定します。

jq -r '.packageDirectories[0].path + "/main/default"' sfdx-project.json

結果を <source-dir>(例:force-app/main/default)として、以下のすべてのコマンドで使用します。

React Experience サイトには常に両方が必要なため、両方の権限セットを書き込みます。

  1. assets/MFA_Required_For_Community.permissionset-meta.xml を読み取ります
  2. ユーザーのプロジェクト内の <source-dir>/permissionsets/MFA_Required_For_Community.permissionset-meta.xml に書き込みます
  3. assets/API_Enabled_For_Community.permissionset-meta.xml を読み取ります
  4. <source-dir>/permissionsets/API_Enabled_For_Community.permissionset-meta.xml に書き込みます
ステップ 3:組織にデプロイする
sf project deploy start \
  --source-dir <source-dir>/permissionsets \
  --target-org <org-alias> --test-level NoTestRun
ステップ 3b:コミュニティプロファイルがネットワークのメンバーか検証する

ユーザーに権限セットを割り当てる前に、コミュニティプロファイルがサイトメンバーとして登録されていることを確認してください。登録されていない場合、コミュニティユーザーはログインできず、MFA も起動しません。

  1. 現在のネットワークメンバーを照会します。
sf data query --target-org <org-alias> \
  --query "SELECT Id, ParentId FROM NetworkMemberGroup WHERE NetworkId = '<NETWORK_ID>'" --json
  1. コミュニティプロファイルが一覧に含まれているか確認します。
sf data query --target-org <org-alias> \
  --query "SELECT Id, Name FROM Profile WHERE UserType IN ('CspLitePortal', 'PowerCustomerSuccess') AND Name LIKE '%Community%'" --json
  1. プロファイルがメンバーでない場合は、.network-meta.xml に追加します。
<networkMemberGroups>
    
    <profile>YOUR_COMMUNITY_PROFILE_NAME</profile>
    
</networkMemberGroups>
  1. 更新したネットワークメタデータをデプロイします。
sf project deploy start \
  --source-dir <source-dir>/networks \
  --target-org <org-alias> --test-level NoTestRun

重要: コミュニティプロファイルがネットワークのメンバーでない場合、そのプロファイルを持つユーザーはログインできません。つまり、権限セットが正しく割り当てられていても MFA は起動しません。新しくデプロイした組織でよく見られる設定ミスです。

ステップ 3c:ゲストプロファイルにログイン用 Apex クラスへのアクセス権があるか検証する

サイトのログインページはゲストユーザー(未認証)として実行されます。ゲストプロファイルにログイン用 Apex クラスへのアクセス権がない場合、ユーザーには FORBIDDEN: You do not have access to the Apex class named: UIBundleLogin が表示され、MFA チャレンジに進めません。

  1. サイトのゲストユーザープロファイルを特定します。
sf data query --target-org <org-alias> \
  --query "SELECT Id, Username, Profile.Name, Profile.Id FROM User WHERE UserType = 'Guest' AND IsActive = true" --json
  1. 不足している UIBundle ログインクラスへのアクセス権を付与します。 6 つのクラスは UIBundleLogin、UIBundleAuthUtils、UIBundleForgotPassword、UIBundleChangePassword、UIBundleRegistration、UIBundleSocialLoginConfig です。references/setup.md の「Grant Guest Profile Apex Class Access」にある匿名 Apex を実行します(既存のアクセス権との差分を調べ、不足分のみを追加します)。または、同じクラスの <classAccess> エントリをゲストプロファイルのメタデータ XML にデプロイします。

重要: これは MFA 固有の設定ではありませんが、設定しないとログインページ自体が動作しません。MFA が実際に起動することを保証するため、スキルでこの設定を検証する必要があります。ゲストプロファイルに完全なクラスアクセス権がない、新しくデプロイした組織でよく見られます。

ステップ 4:権限セットを割り当てる

コミュニティユーザーを検索します。

sf data query --target-org <org-alias> \
  --query "SELECT Id, Username, Name, Profile.Name FROM User WHERE UserType IN ('CspLitePortal', 'PowerCustomerSuccess', 'CustomerSuccess') AND IsActive = true" --json
コミュニティユーザーが存在する場合:

権限セット ID を検索します。

sf data query --target-org <org-alias> \
  --query "SELECT Id, Name FROM PermissionSet WHERE Name IN ('MFA_Required_For_Community', 'API_Enabled_For_Community')" --json

各ユーザーに割り当てます。

sf data create record --target-org <org-alias> --sobject PermissionSetAssignment \
  --values "AssigneeId='<USER_ID>' PermissionSetId='<PERM_SET_ID>'" --json

または、dx-org-permission-set-assign スキルに委任します。

sf org assign permset --name MFA_Required_For_Community --target-org <org-alias> --json
sf org assign permset --name API_Enabled_For_Community --target-org <org-alias> --json
コミュニティユーザーが見つからない場合:

ユーザーに次のように尋ねます。「この組織に有効なコミュニティユーザーが見つかりません。MFA が機能することを確認できるよう、テスト用コミュニティユーザーを作成しますか?」

ユーザーが同意した場合は、テスト用コミュニティユーザーを作成します。

  1. サイトのネットワーク設定からコミュニティプロファイルを見つけます。
sf data query --target-org <org-alias> \
  --query "SELECT Id, Name FROM Profile WHERE UserType IN ('CspLitePortal', 'PowerCustomerSuccess') AND Name LIKE '%Customer Community%'" --json
  1. Account を作成します(コミュニティユーザーの親として必須です)。
sf data create record --target-org <org-alias> --sobject Account \
  --values "Name='MFA Test Account'" --json
  1. Contact を作成します(Account にリンクします)。
sf data create record --target-org <org-alias> --sobject Contact \
  --values "FirstName='MFA' LastName='Test User' Email='mfa.testuser@<site-name>.test' AccountId='<ACCOUNT_ID>'" --json
  1. コミュニティプロファイルを指定してユーザーを作成します。
sf data create record --target-org <org-alias> --sobject User \
  --values "FirstName='MFA' LastName='Test User' Email='mfa.testuser@<site-name>.test' Username='mfa.testuser@<site-name>.test' Alias='mfatest' ProfileId='<PROFILE_ID>' ContactId='<CONTACT_ID>' EmailEncodingKey='UTF-8' LanguageLocaleKey='en_US' LocaleSidKey='en_US' TimeZoneSidKey='America/Los_Angeles'" --json
  1. テストユーザーのパスワードを設定します。
sf data update record --target-org <org-alias> --sobject User \
  --where "Username='mfa.testuser@<site-name>.test'" \
  --values "IsActive=true" --json
sf org generate password --target-org <org-alias> --on-behalf-of mfa.testuser@<site-name>.test --json
  1. 新しいユーザーに両方の権限セットを割り当てます。
sf org assign permset --name MFA_Required_For_Community --target-org <org-alias> --on-behalf-of mfa.testuser@<site-name>.test --json
sf org assign permset --name API_Enabled_For_Community --target-org <org-alias> --on-behalf-of mfa.testuser@<site-name>.test --json

ユーザーがテストできるよう、認証情報を伝えます。

「テストユーザー mfa.testuser@<site-name>.test を作成しました。パスワードは <generated-password> です。この認証情報を使って、サイトで MFA が機能することを確認できます。」

IMPORTANT: コミュニティユーザーには、Account → Contact → User の階層が必要です。コミュニティプロファイルで、リンクされた Contact がない状態で User を作成すると失敗します。

ステップ 5:権限セットをサイトメンバーとして登録する(networkMemberGroups)

networkMemberGroups はメンバーシップ/アクセスのゲートです。サイトのメンバーとして扱われる、プロファイルと権限セットの所有者を一覧表示します。ユーザーに MFA を割り当てるものではありません。割り当てはステップ 4(ユーザーごと)で行います。割り当て済みのユーザーが引き続きサイトメンバーとして扱われるよう、ここに権限セットを登録します。

  1. プロジェクト内にある既存の .network-meta.xml を見つけます。
find . -name "*.network-meta.xml" -not -path "*/node_modules/*"
  1. ファイルを読み込み、<networkMemberGroups> セクションを見つけます。

  2. 権限セットのエントリを追加します(まだ存在しない場合)。

<networkMemberGroups>
    
    <profile>YOUR_COMMUNITY_PROFILE_NAME</profile>
    
    <permissionSet>MFA_Required_For_Community</permissionSet>
    <permissionSet>API_Enabled_For_Community</permissionSet>
</networkMemberGroups>

IMPORTANT: ネットワークメタデータのデプロイは宣言型であり、デプロイする内容が完全な状態になります。新しい .network-meta.xml を一から作成してはいけません。必ず既存のファイルを読み込んで、エントリを追加してください。

  1. 更新したネットワークメタデータをデプロイします。
sf project deploy start \
  --source-dir <source-dir>/networks \
  --target-org <org-alias> --test-level NoTestRun
ステップ 6:公開して確認する
sf community publish --name "<site-name>" --target-org <org-alias>

確認手順:

  1. シークレットブラウザーを開きます。
  2. サイトのログインページに移動します。
  3. 認証情報を入力します → MFA チャレンジページが表示されます(vforcesite ドメイン上)。
  4. MFA を完了します → サイトにログインした状態で移動します。

ルール

ルール理由
コミュニティ MFA に組織全体の Identity Verification チェックボックスを使用しない内部ユーザーにのみ適用され、コミュニティのログインには影響しません
React サイトでは常に ApiEnabled をデプロイするログイン後の API 呼び出し(sdk.graphql、sdk.fetch)は、これがないと失敗します
権限セット名は正確に指定し、変更しないMFA_Required_For_Community と API_Enabled_For_Community が正式な名前です
カスタム MFA UI コンポーネントを作成しないプラットフォームが MFA チャレンジのフロー全体を処理するため、カスタム UI は重複し、競合を引き起こします
テスト前に必ず割り当てるデプロイだけでは MFA は有効になりません。特定のユーザーへの割り当てが必要です

注意点

症状原因対処方法
ログイン時に MFA チャレンジが表示されないユーザーに ForceTwoFactor 権限が割り当てられていないユーザーに対する PermissionSetAssignment が存在することを確認します
ログイン後に API_DISABLED_FOR_ORG が表示されるApiEnabled 権限がないAPI_Enabled_For_Community 権限セットを割り当てます
MFA ページに Salesforce のデフォルトのブランディングが表示されるNetworkBranding メタデータがデプロイされていないreferences/branding.md を読み、カスタムブランディングをデプロイします
MFA ページの URL に vforcesite が含まれている想定どおりの動作です。バグではありませんプラットフォームは Force.com Site ドメインからログイン/MFA を提供します
Identity Verification が有効なのにコミュニティの MFA が表示されない使用している仕組みが間違っている代わりに Permission Set で ForceTwoFactor を使用します
ユーザーにすでに MFA が設定されているのにチャレンジが表示されないアクティブなセッションが存在するシークレット/プライベートブラウザーでテストします
権限セットはデプロイ済みなのに MFA が適用されないデプロイ済みだが割り当てられていない割り当て手順を実行します。デプロイと割り当ては別です
組織にコミュニティユーザーが見つからないユーザーがまだ作成されていないか、セルフ登録されていない検証用のテストコミュニティユーザー(Account → Contact → User の階層)を作成するか確認します。権限セットは引き続きデプロイされ、networkMemberGroups も更新されているため、ユーザーが追加されれば組織で MFA を利用できます。
新規ユーザーに MFA が自動的に適用されないnetworkMemberGroups はサイトメンバーシップのみを定義するもので、ユーザーに権限セットを割り当てるものではない必要なユーザーごとに MFA_Required_For_Community と API_Enabled_For_Community を割り当てます(Step 4)
FORBIDDEN: You do not have access to the Apex class named: UIBundleLoginサイトのゲストプロファイルに Apex クラスへのアクセス権がないStep 3c を実行し、すべての UIBundle ログインクラスへのアクセス権をゲストプロファイルに付与します
コミュニティユーザーがログインできない(何も表示されずにリダイレクトされる、または portal user email settings エラーが発生する)コミュニティプロファイルがネットワークメンバーではないか、メールの配信設定が All Email になっていない.network-meta.xml の <networkMemberGroups> にプロファイルを追加して再デプロイします(Step 3b)。Setup → Email → Deliverability で、メールの配信設定が「All Email」になっていることを確認します。

出力ファイル

ユーザーのプロジェクトに生成されるファイル:

ファイル生成される条件
permissionsets/MFA_Required_For_Community.permissionset-meta.xml常に
permissionsets/API_Enabled_For_Community.permissionset-meta.xml常に

実施内容をまとめる際、権限セットを <networkMemberGroups> に追加する(またはネットワークを更新する)ことで、新規ユーザーやセルフ登録ユーザーに MFA が自動的に適用されると主張しないでください。 そのような動作にはなりません。networkMemberGroups が定義するのはサイトメンバーシップのみです。MFA が適用されるのは、権限セットを明示的に割り当てられたユーザーだけです(Step 4)。ネットワークの変更については、「権限セットをサイトメンバーとして登録した」と報告し、自動割り当てとは表現しないでください。


スキル間の連携

条件委任先
ユーザーが割り当てのみ必要としている(すでにデプロイ済み)dx-org-permission-set-assign
ユーザーがプロジェクトのメタデータをすべてデプロイする必要があるplatform-metadata-deploy
ユーザーがログインページの UI をカスタマイズしたいexperience-ui-bundle-frontend-generate
ユーザーが新しい汎用権限セットを作成する必要があるplatform-permission-set-generate
ユーザーが IDP/ソーシャルログインを希望している(MFA とは別の機能)React サイトでサポートされています。組み込みのソーシャルログインコンポーネントは、リンクされた Auth Providers をログインページに自動的に表示します。Setup で Auth Providers を作成し、experience-ui-bundle-deploy のソーシャルログイン手順(org-setup.config.json の socialLogin)で React サイトにリンクします。React の SSO 管理 UI は非表示のため、リンクは Setup のクリック操作ではなく、プログラムによって行います。references/social-login.md を参照してください。

リファレンスファイル一覧

ファイル読むタイミング
assets/MFA_Required_For_Community.permissionset-meta.xmlステップ 2 — 権限セットをプロジェクトに書き込むとき
assets/API_Enabled_For_Community.permissionset-meta.xmlステップ 2 — 常にデプロイされます
references/branding.mdMFA/ログインページの外観をカスタマイズしたい場合
references/social-login.mdMFA と併用または MFA の代わりに、React サイトで IDP/SSO/ソーシャルログインを利用したい場合
references/setup.mdステップ 3~5 — 割り当て、ネットワークメンバーシップ、公開に関する詳細なリファレンス

コメント