次の方法で共有


Azure Active Directory B2C で CAPTCHA を有効にする

重要

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

開始する前にこのページの上部にある ポリシーの種類 セレクターを使用して、設定するポリシーの種類を選択します。 Azure Active Directory B2C には、ユーザーがアプリケーションを操作する方法を定義する 2 つの方法 (定義済みのユーザー フローを使用する、または完全に構成可能なカスタム ポリシーを使用する) があります。 この記事で必要な手順は、方法ごとに異なります。

Azure Active Directory B2C (Azure AD B2C) を使用すると、CAPTCHA を有効にして、コンシューマー向けアプリケーションに対する自動攻撃を防ぐことができます。 Azure AD B2C の CAPTCHA では、オーディオとビジュアルの両方の CAPTCHA の課題がサポートされています。 このセキュリティ機能は、ローカル アカウントのサインアップ フローとサインイン フローの両方で有効にすることができます。 CAPTCHA は、ソーシャル ID プロバイダーのサインインには適用されません。

この機能はパブリック プレビュー段階です

[前提条件]

CAPTCHA を有効にする

  1. Azure portal にサインインします。

  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。

  3. 左側のメニューで、 Azure AD B2C を選択します。 または、[ すべてのサービス ] を選択し、 Azure AD B2C を検索して選択します。

  4. ユーザーフローを選択します。

  5. CAPTCHA を有効にするユーザー フローを選択します。 たとえば、 B2C_1_signinsignup

  6. [プロパティ] を選択します。

  7. CAPTCHA (プレビュー) で、CAPTCHA を有効にするフロー (CAPTCHA の有効化 - サインアップなど) を選択します。

  8. 保存 を選択します。

ユーザー フローをテストする

ユーザー フローのテスト」 の手順を使用して、選択したフローに対して CAPTCHA が有効になっていることをテストして確認します。 CAPTCHA の種類, つまりビジュアルまたはオーディオを選択すると, 画面に表示されるか音声で読み上げられる文字を入力するよう求められます。

カスタム ポリシーで CAPTCHA を有効にするには、既存のカスタム ポリシー ファイルを更新する必要があります。 既存のカスタム ポリシー ファイルがない場合は、 .zip ファイルをダウンロード するか、 https://github.com/Azure-Samples/active-directory-b2c-custom-policy-starterpackからリポジトリを複製します。 この記事では、 /Display Controls Starterpack/LocalAccounts/ フォルダー内の XML ファイルを更新します。

要求を宣言する

カスタム ポリシーで CAPTCHA を有効にするには、さらに要求が必要です。

  1. VS Code で、 TrustFrameworkBase.XML ファイルを開きます。

  2. ClaimsSchema セクションで、次のコードを使用して要求を宣言します。

     <!--<ClaimsSchema>-->
      ...
      <ClaimType Id="inputSolution">
        <DataType>string</DataType>
      </ClaimType>
    
      <ClaimType Id="solved">
        <DataType>boolean</DataType>
      </ClaimType>
    
      <ClaimType Id="reason">
        <DataType>string</DataType>
      </ClaimType>
    
      <ClaimType Id="azureregion">
        <DataType>string</DataType>
      </ClaimType>
    
      <ClaimType Id="challengeId">
        <DisplayName>The ID of the generated captcha</DisplayName>
        <DataType>string</DataType>
        <UserHelpText>Captcha challenge identifier</UserHelpText>
        <UserInputType>Paragraph</UserInputType>
      </ClaimType>
    
      <ClaimType Id="challengeType">
        <DisplayName>Type of captcha (visual / audio)</DisplayName>
        <DataType>string</DataType>
        <UserHelpText>Captcha challenge type</UserHelpText>
        <UserInputType>Paragraph</UserInputType>
      </ClaimType>
    
      <ClaimType Id="challengeString">
        <DisplayName>Captcha challenge code</DisplayName>
        <DataType>string</DataType>
        <UserHelpText>Captcha challenge code</UserHelpText>
        <UserInputType>Paragraph</UserInputType>
      </ClaimType>
    
      <ClaimType Id="captchaEntered">
        <DisplayName>Captcha entered by the user</DisplayName>
        <DataType>string</DataType>
        <UserHelpText>Enter the characters you see</UserHelpText>
        <UserInputType>TextBox</UserInputType>
      </ClaimType>
    
      <ClaimType Id="isCaptchaSolved">
        <DisplayName>Flag indicating that the captcha was successfully solved</DisplayName>
        <DataType>boolean</DataType>
      </ClaimType>
    
      <ClaimType Id="mfaCaptchaEnabled">
        <DisplayName>flag used to control captcha enabled in MFA</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
    
      <ClaimType Id="signupCaptchaEnabled">
        <DisplayName>flag used to control captcha enabled during signup</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
    
      <ClaimType Id="signinCaptchaEnabled">
        <DisplayName>flag used to control captcha enabled during signin</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      ...
     <!--<ClaimsSchema>-->
    

表示コントロールを構成する

カスタム ポリシーに対して CAPTCHA を有効にするには、 CAPTCHA 表示コントロールを使用します。 CAPTCHA ディスプレイ コントロールは CAPTCHA イメージを生成してレンダリングします。

TrustFrameworkBase.XML ファイルで、DisplayControls要素を見つけ、次の表示コントロールを子要素として追加します。 DisplayControls要素がまだない場合は、要素を追加します。

<!--<DisplayControls>-->
...    
<DisplayControl Id="captchaControlChallengeCode" UserInterfaceControlType="CaptchaControl" DisplayName="Help us beat the bots">    
    <InputClaims>
        <InputClaim ClaimTypeReferenceId="challengeType" />
        <InputClaim ClaimTypeReferenceId="challengeId" />
    </InputClaims>

    <DisplayClaims>
        <DisplayClaim ClaimTypeReferenceId="challengeType" ControlClaimType="ChallengeType" />
        <DisplayClaim ClaimTypeReferenceId="challengeId" ControlClaimType="ChallengeId" />
        <DisplayClaim ClaimTypeReferenceId="challengeString" ControlClaimType="ChallengeString" />
        <DisplayClaim ClaimTypeReferenceId="captchaEntered" ControlClaimType="CaptchaEntered" />
    </DisplayClaims>

    <Actions>
    <Action Id="GetChallenge">
        <ValidationClaimsExchange>
        <ValidationClaimsExchangeTechnicalProfile
            TechnicalProfileReferenceId="HIP-GetChallenge" />
        </ValidationClaimsExchange>
    </Action>

    <Action Id="VerifyChallenge">
        <ValidationClaimsExchange>
        <ValidationClaimsExchangeTechnicalProfile
            TechnicalProfileReferenceId="HIP-VerifyChallenge" />
        </ValidationClaimsExchange>
    </Action>
    </Actions>
</DisplayControl> 
...
<!--</DisplayControls>-->

CAPTCHA 技術プロファイルを構成する

Azure AD B2C CAPTCHA 技術プロファイル は、CAPTCHA チャレンジを検証します。 この技術プロファイルでは、CAPTCHA コードを生成したり、構成方法に応じて確認したりできます。

TrustFrameworkBase.XML ファイルで、ClaimsProviders要素を見つけ、次のコードを使用してクレーム プロバイダーを追加します。

<!--<ClaimsProvider>-->
...
<ClaimsProvider>

    <DisplayName>HIPChallenge</DisplayName>

    <TechnicalProfiles>

    <TechnicalProfile Id="HIP-GetChallenge">
        <DisplayName>GetChallenge</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.CaptchaProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
            <Item Key="Operation">GetChallenge</Item>
            <Item Key="Brand">HIP</Item>
        </Metadata>
        <InputClaims>
            <InputClaim ClaimTypeReferenceId="challengeType" />
        </InputClaims>
        <DisplayClaims>
            <DisplayClaim ClaimTypeReferenceId="challengeString" />
        </DisplayClaims>
        <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="challengeId" />
            <OutputClaim ClaimTypeReferenceId="challengeString" PartnerClaimType="ChallengeString" />
            <OutputClaim ClaimTypeReferenceId="azureregion" />
        </OutputClaims>
    </TechnicalProfile>
    <TechnicalProfile Id="HIP-VerifyChallenge">
        <DisplayName>Verify Code</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.CaptchaProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
        <Item Key="Brand">HIP</Item>
            <Item Key="Operation">VerifyChallenge</Item>
        </Metadata>
        <InputClaims>
            <InputClaim ClaimTypeReferenceId="challengeType" DefaultValue="Visual" />
            <InputClaim ClaimTypeReferenceId="challengeId" />
            <InputClaim ClaimTypeReferenceId="captchaEntered" PartnerClaimType="inputSolution" Required="true" />
            <InputClaim ClaimTypeReferenceId="azureregion" />
        </InputClaims>
        <DisplayClaims>
            <DisplayClaim ClaimTypeReferenceId="captchaEntered" />
        </DisplayClaims>
        <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="challengeId" />
            <OutputClaim ClaimTypeReferenceId="isCaptchaSolved" PartnerClaimType="solved" />
            <OutputClaim ClaimTypeReferenceId="reason" PartnerClaimType="reason" />
        </OutputClaims>
    </TechnicalProfile>
    </TechnicalProfiles>
</ClaimsProvider>    
...
<!--<ClaimsProviders>-->

GetChallenge 操作で構成した CAPTCHA 技術プロファイルは、CAPTCHA チャレンジ文字列を生成して表示します。 VerifyChallenge を使用して構成した CAPTCHA 技術プロファイルは、ユーザーが入力したチャレンジ文字列を検証します。

コンテンツ定義のページ レイアウトを更新する

さまざまなページ レイアウトでは、次のページ レイアウト バージョンを使用します。

ページのレイアウト ページ レイアウトのバージョン範囲
セルフアサート >=2.1.33
ユニファイドSSP >=2.1.21
多要素 >=1.2.19

例:

TrustFrameworkBase.XML ファイルの ContentDefinitions 要素の下で、Id="api.localaccountsignup" を持つコンテンツ定義を見つけ、次のコードに示すように DataUri を更新します。

<!---<ContentDefinitions>-->
...
<ContentDefinition Id="api.localaccountsignup">
    ...
    <!--Update this DataUri-->
    <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.27</DataUri>
    ...
</ContentDefinition>
...
<!---</ContentDefinitions>-->

セルフアサートされたページ レイアウト バージョンを 2.1.27 として指定します。

技術プロファイルと表示コントロールを構成したら、CAPTCHA を有効にするフローを指定できます。

サインアップまたはサインイン フローで CAPTCHA を有効にする

サインアップまたはサインイン フローで CAPTCHA を有効にするには、次の手順に従います。

  1. SignUpOrSignIn などのサインアップ サインイン ユーザー体験を調べて、サインアップまたはサインイン エクスペリエンスを表示するセルフ アサート技術プロファイルを特定します。

  2. LocalAccountSignUpWithLogonEmail などの技術プロファイルで、次のコードに示すように、メタデータ キーと表示要求エントリを追加します。

<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
    ...
  <Metadata>
    ...
    <!--Add this metadata entry. Set value to true to activate CAPTCHA-->
    <Item Key="setting.enableCaptchaChallenge">true</Item>
    ...
  </Metadata>
    ...
  <DisplayClaims>
    ...
    <!--Add this display claim, which is a reference to the captcha display control-->
    <DisplayClaim DisplayControlReferenceId="captchaControlChallengeCode" /> 
    ...
  </DisplayClaims>
    ...
</TechnicalProfile>

表示要求エントリは、前に構成した表示コントロールを参照します。

MFA フローで CAPTCHA を有効にする

MFA フローで CAPTCHA を有効にするには、2 つの技術プロファイル (セルフアサート技術プロファイルと 電話要素技術プロファイル) で更新を行う必要があります。

  1. SignUpOrSignIn などのサインアップ サインイン ユーザー体験を調べて、サインアップまたはサインイン フローを担当するセルフアサート技術プロファイルと電話要素技術プロファイルを特定します。

  2. どちらの技術プロファイルでも、次のコードに示すように、メタデータ キーと表示要求エントリを追加します。

<TechnicalProfile Id="PhoneFactor-InputOrVerify">
    ...
  <Metadata>
    ...
    <!--Add this metadata entry. Value set to true-->
    <Item Key="setting.enableCaptchaChallenge">true</Item>
    ...
  </Metadata>
    ...
  <DisplayClaims>
    ...
    <!--Add this display claim-->
    <DisplayClaim DisplayControlReferenceId="captchaControlChallengeCode" /> 
    ...
  </DisplayClaims>
    ...
</TechnicalProfile>

CAPTCHA 機能フラグを有効にする

サインアップ、サインイン、または MFA 中に CAPTCHA を適用するには、各シナリオの機能フラグを有効にする技術プロファイルを追加し、ユーザー体験で技術プロファイルを呼び出す必要があります。

  1. TrustFrameworkBase.XML ファイルで、ClaimsProviders要素を見つけ、次のコードを使用してクレーム プロバイダーを追加します。
<!--<ClaimsProvider>-->
...
<ClaimsProvider>

    <DisplayName>Set Feature Flags</DisplayName>

    <TechnicalProfiles>

    <TechnicalProfile Id="SetFeatureDefaultValue">
        <DisplayName>Set Feature Flags</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="signupCaptchaEnabled" DefaultValue="true" />
            <OutputClaim ClaimTypeReferenceId="signinCaptchaEnabled" DefaultValue="true" />
            <OutputClaim ClaimTypeReferenceId="mfaCaptchaEnabled" DefaultValue="true" />
        </OutputClaims>
    </TechnicalProfile>
    </TechnicalProfiles>
</ClaimsProvider>
...
<!--<ClaimsProviders>-->
  1. CAPTCHA シナリオに応じて、 DefaultValue を true または false に設定する

  2. 機能フラグ技術プロファイルをユーザー体験に追加し、オーケストレーション手順の残りの部分の順序を更新します。

<!--<UserJourneys>-->
...
<UserJourney Id="SignUpOrSignIn">
    <OrchestrationSteps>

        <!--Add this orchestration step-->
        <OrchestrationStep Order="1" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="SetFeatureDefaultValue" TechnicalProfileReferenceId="SetFeatureDefaultValue" />
          </ClaimsExchanges>
        </OrchestrationStep>
...
<!--<UserJourneys>-->

カスタム ポリシー ファイルをアップロードする

「ポリシーのアップロード」の手順を使用して、カスタム ポリシー ファイルをアップロードします。

カスタム ポリシーをテストする

「カスタム ポリシーをテストする」の手順を使用して、選択したフローで CAPTCHA が有効になっていることをテストして確認します。 CAPTCHA の種類, つまりビジュアルまたはオーディオを選択すると, 画面に表示されるか音声で読み上げられる文字を入力するよう求められます。

  • サインアップのみのユーザー フローで MFA ステップに CAPTCHA を追加することはできません。
  • MFA フローでは、選択した MFA メソッドが SMS または電話、SMS のみ、または電話呼び出しのみである場合に CAPTCHA が適用されます。