experience-ui-bundle-mfa-configure について
Salesforce Experience Site のコミュニティユーザーに MFA を設定するためのスキルです。権限セットのデプロイと割り当て、ログインフローの確認、MFA を妨げるサイト設定の調査を行います。
主な機能
- 01MFA と API 権限セットのデプロイ
- 02コミュニティユーザーへの権限セット割り当て
- 03ネットワークメンバーシップとゲスト Apex アクセスの確認
- 04MFA ログインチャレンジのトラブルシューティング
- 05ログインページのブランディング設定
活用シーン
- 01Experience Site ユーザーへの MFA 有効化
- 02ログイン時の MFA チャレンジ確認
- 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.xmlMFA_Required_For_Community.permissionset-meta.xmlreferences/branding.mdsetup.mdsocial-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 サイトには常に両方が必要なため、両方の権限セットを書き込みます。
assets/MFA_Required_For_Community.permissionset-meta.xmlを読み取ります- ユーザーのプロジェクト内の
<source-dir>/permissionsets/MFA_Required_For_Community.permissionset-meta.xmlに書き込みます assets/API_Enabled_For_Community.permissionset-meta.xmlを読み取ります<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 も起動しません。
- 現在のネットワークメンバーを照会します。
sf data query --target-org <org-alias> \
--query "SELECT Id, ParentId FROM NetworkMemberGroup WHERE NetworkId = '<NETWORK_ID>'" --json
- コミュニティプロファイルが一覧に含まれているか確認します。
sf data query --target-org <org-alias> \
--query "SELECT Id, Name FROM Profile WHERE UserType IN ('CspLitePortal', 'PowerCustomerSuccess') AND Name LIKE '%Community%'" --json
- プロファイルがメンバーでない場合は、
.network-meta.xmlに追加します。
<networkMemberGroups>
<profile>YOUR_COMMUNITY_PROFILE_NAME</profile>
</networkMemberGroups>
- 更新したネットワークメタデータをデプロイします。
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 チャレンジに進めません。
- サイトのゲストユーザープロファイルを特定します。
sf data query --target-org <org-alias> \
--query "SELECT Id, Username, Profile.Name, Profile.Id FROM User WHERE UserType = 'Guest' AND IsActive = true" --json
- 不足している 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 が機能することを確認できるよう、テスト用コミュニティユーザーを作成しますか?」
ユーザーが同意した場合は、テスト用コミュニティユーザーを作成します。
- サイトのネットワーク設定からコミュニティプロファイルを見つけます。
sf data query --target-org <org-alias> \
--query "SELECT Id, Name FROM Profile WHERE UserType IN ('CspLitePortal', 'PowerCustomerSuccess') AND Name LIKE '%Customer Community%'" --json
- Account を作成します(コミュニティユーザーの親として必須です)。
sf data create record --target-org <org-alias> --sobject Account \
--values "Name='MFA Test Account'" --json
- 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
- コミュニティプロファイルを指定してユーザーを作成します。
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
- テストユーザーのパスワードを設定します。
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
- 新しいユーザーに両方の権限セットを割り当てます。
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(ユーザーごと)で行います。割り当て済みのユーザーが引き続きサイトメンバーとして扱われるよう、ここに権限セットを登録します。
- プロジェクト内にある既存の
.network-meta.xmlを見つけます。
find . -name "*.network-meta.xml" -not -path "*/node_modules/*"
-
ファイルを読み込み、
<networkMemberGroups>セクションを見つけます。 -
権限セットのエントリを追加します(まだ存在しない場合)。
<networkMemberGroups>
<profile>YOUR_COMMUNITY_PROFILE_NAME</profile>
<permissionSet>MFA_Required_For_Community</permissionSet>
<permissionSet>API_Enabled_For_Community</permissionSet>
</networkMemberGroups>
IMPORTANT: ネットワークメタデータのデプロイは宣言型であり、デプロイする内容が完全な状態になります。新しい
.network-meta.xmlを一から作成してはいけません。必ず既存のファイルを読み込んで、エントリを追加してください。
- 更新したネットワークメタデータをデプロイします。
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>
確認手順:
- シークレットブラウザーを開きます。
- サイトのログインページに移動します。
- 認証情報を入力します → MFA チャレンジページが表示されます(vforcesite ドメイン上)。
- 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.md | MFA/ログインページの外観をカスタマイズしたい場合 |
references/social-login.md | MFA と併用または MFA の代わりに、React サイトで IDP/SSO/ソーシャルログインを利用したい場合 |
references/setup.md | ステップ 3~5 — 割り当て、ネットワークメンバーシップ、公開に関する詳細なリファレンス |