Azure Active Directory B2C でカスタム ポリシーを使用して SAML ID プロバイダーとして AD FS を追加する

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

この機能は、カスタム ポリシーでのみ使用できます。 セットアップ手順は、前のセレクターで [カスタム ポリシー] を選択します。

注意

Azure Active Directory B2C で、カスタム ポリシーは、主に、複雑なシナリオに取り組む用途向けに設計されています。 ほとんどのシナリオで、組み込みユーザー フローを使用することをお勧めします。 まだ行っていない場合は、Active Directory B2C でのカスタム ポリシーの概要に関する記事で、カスタム ポリシー スターター パックの詳細を確認してください。

この記事では、Azure Active Directory B2C (Azure AD B2C) でカスタム ポリシーを使用して AD FS ユーザー アカウントのサインインを有効にする方法について説明します。 サインインを有効にするには、SAML ID プロバイダーをカスタム ポリシーに追加します。

前提条件

自己署名証明書を作成する

証明書をまだ持っていない場合は、自己署名証明書を使用できます。 自己署名証明書は、証明機関 (CA) によって署名されていないセキュリティ証明書であり、CA によって署名された証明書のセキュリティ保証を提供するものではありません。

Windows では、PowerShell の New-SelfSignedCertificate コマンドレットを使用して証明書を生成します。

  1. この PowerShell コマンドを実行して、自己署名証明書を生成します。 contosowebapp.contoso.onmicrosoft.com などのアプリケーションと Azure AD B2C のテナント名に合わせて -Subject 引数を変更します。 また、証明書に別の有効期限を指定するように -NotAfter 日付を調整することもできます。

    New-SelfSignedCertificate `
        -KeyExportPolicy Exportable `
        -Subject "CN=yourappname.yourtenant.onmicrosoft.com" `
        -KeyAlgorithm RSA `
        -KeyLength 2048 `
        -KeyUsage DigitalSignature `
        -NotAfter (Get-Date).AddMonths(12) `
        -CertStoreLocation "Cert:\CurrentUser\My"
    
  2. Windows コンピューターで、 [ユーザー証明書の管理] を検索して選択します

  3. [証明書 - 現在のユーザー] で、 [個人用]>[証明書]>yourappname.yourtenant.onmicrosoft.com を開きます。

  4. 証明書を選択し、 [アクション]>[すべてのタスク]>[エクスポート] の順に選択します。

  5. [次へ]>[はい、秘密キーをエクスポートします]>[次へ] を選択します。

  6. [エクスポート ファイルの形式] の既定値を受け入れて、 [次へ] を選択します。

  7. [パスワード] オプションを有効にして、証明書のパスワードを入力し、 [次へ] を選択します。

  8. 証明書を保存する場所を指定するには、 [参照] を選択し、任意のディレクトリに移動します。

  9. [名前を付けて保存] ウィンドウで、 [ファイル名] を入力して、 [保存] を選択します。

  10. [次へ]>[完了] の順に選択します。

Azure AD B2C で .pfx ファイルのパスワードを受け入れるには、Windows 証明書ストアのエクスポート ユーティリティで、AES256-SHA256 ではなく、TripleDES-SHA1 オプションを使用してパスワードを暗号化する必要があります。

ポリシー キーを作成する

証明書を Azure AD B2C テナントに格納する必要があります。

  1. Azure portal にサインインします。
  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選び、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
  3. Azure portal の左上隅にある [すべてのサービス] を選択してから、 [Azure AD B2C] を検索して選択します。
  4. [概要] ページで、 [Identity Experience Framework] を選択します。
  5. [ポリシー キー] を選択し、 [追加] を選択します。
  6. オプションについては、Uploadを選択します。
  7. ポリシー キーの名前を入力します。 たとえば、「 SAMLSigningCert 」のように入力します。 プレフィックス B2C_1A_ がキーの名前に自動的に追加されます。
  8. 秘密キーが含まれている証明書の .pfx ファイルを参照して選択します。
  9. Create をクリックしてください。

クレーム プロバイダーを追加する

ユーザーが AD FS アカウントを使用してサインインするようにするには、そのアカウントを Azure AD B2C がエンドポイント経由で通信できる相手のクレーム プロバイダーとして定義する必要があります。 エンドポイントは、特定のユーザーが認証されていることを確認するために Azure AD B2C で使う一連の要求を提供します。

AD FS アカウントをクレーム プロバイダーとして定義するには、そのアカウントをポリシーの拡張ファイル内の ClaimsProviders 要素に追加します。 詳細については、SAML ID プロバイダーの定義に関するページをご覧ください。

  1. TrustFrameworkExtensions.xml を開きます。

  2. ClaimsProviders 要素を見つけます。 存在しない場合は、それをルート要素の下に追加します。

  3. 新しい ClaimsProvider を次のように追加します。

    <ClaimsProvider>
      <Domain>contoso.com</Domain>
      <DisplayName>Contoso</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="Contoso-SAML2">
          <DisplayName>Contoso</DisplayName>
          <Description>Login with your AD FS account</Description>
          <Protocol Name="SAML2"/>
          <Metadata>
            <Item Key="WantsEncryptedAssertions">false</Item>
            <Item Key="PartnerEntity">https://your-AD-FS-domain/federationmetadata/2007-06/federationmetadata.xml</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="SamlMessageSigning" StorageReferenceId="B2C_1A_SAMLSigningCert"/>
          </CryptographicKeys>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="userPrincipalName" />
            <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name"/>
            <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="family_name"/>
            <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email"/>
            <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name"/>
            <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="contoso.com" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication"/>
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
            <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
            <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
            <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
          </OutputClaimsTransformations>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-Saml-idp"/>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
  4. your-AD-FS-domain を AD FS ドメインの名前に置き換え、identityProvider 出力要求の値を DNS (ドメインを示す任意の値) に置き換えます。

  5. <ClaimsProviders> セクションを見つけて、次の XML スニペットを追加します。 ポリシーに SM-Saml-idp 技術プロファイルが既に含まれている場合、次の手順に進みます。 詳細については、シングル サインオン セッション管理に関するページを参照してください。

    <ClaimsProvider>
      <DisplayName>Session Management</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="SM-Saml-idp">
          <DisplayName>Session Management Provider</DisplayName>
          <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.SamlSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <Metadata>
            <Item Key="IncludeSessionIndex">false</Item>
            <Item Key="RegisterServiceProviders">false</Item>
          </Metadata>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
  6. ファイルを保存します。

ユーザー体験を追加する

この時点では、ID プロバイダーはセットアップされていますが、サインイン ページではまだ使用できません。 独自のカスタム ユーザー体験がない場合は、既存のテンプレート ユーザー体験の複製を作成してください。そうでない場合は、次の手順に進みます。

  1. スターター パックから TrustFrameworkBase.xml ファイルを開きます。
  2. Id="SignUpOrSignIn" を含む UserJourney 要素を見つけ、その内容全体をコピーします。
  3. TrustFrameworkExtensions.xml を開き、UserJourneys 要素を見つけます。 要素が存在しない場合は追加します。
  4. コピーした UserJourney 要素の内容全体を UserJourneys 要素の子として貼り付けます。
  5. ユーザー体験の ID の名前を変更します。 たとえば、「 Id="CustomSignUpSignIn" 」のように入力します。

ユーザー体験に ID プロバイダーを追加する

これでユーザー体験ができたので、ユーザー体験に新しい ID プロバイダーを追加します。 最初にサインイン ボタンを追加してから、ボタンをアクションにリンクします。 アクションは、前に作成した技術プロファイルです。

  1. ユーザー体験内で、Type="CombinedSignInAndSignUp" または Type="ClaimsProviderSelection" を含むオーケストレーション ステップ要素を見つけます。 これは通常、最初のオーケストレーション ステップです。 ClaimsProviderSelections 要素には、ユーザーがサインインに使用できる ID プロバイダーの一覧が含まれています。 要素の順序により、ユーザーに表示されるサインイン ボタンの順序が制御されます。 ClaimsProviderSelection XML 要素を追加します。 TargetClaimsExchangeId の値をフレンドリ名に設定します。

  2. 次のオーケストレーション ステップで、ClaimsExchange 要素を追加します。 ID を、ターゲットの要求交換 ID の値に設定します。TechnicalProfileReferenceId の値を、前に作成した技術プロファイルの ID に更新します。

次の XML は、ID プロバイダーを使用したユーザー体験の最初の 2 つのオーケストレーション ステップを示しています。

<OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin">
  <ClaimsProviderSelections>
    ...
    <ClaimsProviderSelection TargetClaimsExchangeId="ContosoExchange" />
  </ClaimsProviderSelections>
  ...
</OrchestrationStep>

<OrchestrationStep Order="2" Type="ClaimsExchange">
  ...
  <ClaimsExchanges>
    <ClaimsExchange Id="ContosoExchange" TechnicalProfileReferenceId="Contoso-SAML2" />
  </ClaimsExchanges>
</OrchestrationStep>

証明書利用者ポリシーを構成する

証明書利用者ポリシー (例 SignUpSignIn.xml) は、Azure AD B2C が実行されるユーザー体験を指定します。 証明書利用者内の DefaultUserJourney 要素を検索します。 ID プロバイダーを追加したユーザー体験 ID と一致するように ReferenceId を更新します。

次の例では、CustomSignUpSignIn ユーザー体験について、ReferenceIdCustomSignUpSignIn に設定しています。

<RelyingParty>
  <DefaultUserJourney ReferenceId="CustomSignUpSignIn" />
  ...
</RelyingParty>

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

  1. Azure portal にサインインします。
  2. ポータル ツール バーにある [ディレクトリ + サブスクリプション] アイコンを選択し、Azure AD B2C テナントを含むディレクトリを選択します。
  3. Azure portal で、 [Azure AD B2C] を検索して選択します。
  4. [ポリシー][Identity Experience Framework] を選択します。
  5. [カスタム ポリシーのアップロード] を選択し、変更した 2 つのポリシー ファイルを拡張ポリシー (TrustFrameworkExtensions.xml など)、証明書利用者ポリシー (SignUpSignIn.xmlなど) の順序でアップロードします。

AD FS 証明書利用者信頼を構成する

Azure AD B2C で ID プロバイダーとして AD FS を使用するには、Azure AD B2C SAML メタデータを使用して AD FS 証明書利用者信頼を作成する必要があります。 次の例は、Azure AD B2C テクニカル プロファイルの SAML メタデータへの URL アドレスを示しています。

https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/your-policy/samlp/metadata?idptp=your-technical-profile

カスタム ドメインを使用する場合は、次の形式を使用します。

https://your-domain-name/your-tenant-name.onmicrosoft.com/your-policy/samlp/metadata?idptp=your-technical-profile

次の値を置き換えます。

  • your-tenant-name を実際のテナント名 (your-tenant.onmicrosoft.com など) に。
  • your-domain-name を実際のカスタム ドメイン名 (login.contoso.com) に。
  • your-policy は、実際のポリシー名に置き換えます。 たとえば、「B2C_1A_signup_signin_adfs」とします。
  • your-technical-profile は、お使いの SAML ID プロバイダー技術プロファイルの名前に置き換えます。 たとえば、「Contoso-SAML2」とします。

ブラウザーを開き、この URL に移動します。 正しい URL を入力し、XML メタデータ ファイルにアクセスできることを確認します。 AD FS 管理スナップインを使用して新しい証明書利用者信頼を追加するには、手動で設定を構成して、フェデレーション サーバーで次の手順を実行します。 この手順を完了するためには、ローカル コンピューター上の管理者のメンバーシップ、またはそれと同等であることが最低限求められます。

  1. [サーバー マネージャー] で、 [ツール] を選択し、 [AD FS Management](AD FS 管理) を選択します。

  2. [証明書利用者信頼の追加] を選択します。

  3. [ようこそ] ページで [要求に対応する] を選択し、 [開始] を選択します。

  4. [データ ソースの選択] ページで、 [オンラインまたはローカル ネットワークで公開されている証明書利用者についてのデータをインポートする] を選択し、Azure AD B2C メタデータ URL を入力し、 [次へ] を選択します。

  5. [表示名の指定] ページで、 [表示名] を入力し、 [メモ] にこの証明書利用者の説明を入力して、 [次へ] を選択します。

  6. [アクセス制御ポリシーの選択] ページで、ポリシーを選択して、 [次へ] を選択します。

  7. [信頼の追加の準備完了] ページで、設定を確認し、 [次へ] を選択して証明書利用者信頼の情報を保存します。

  8. [完了] ページで、 [閉じる] を選択すると、この操作によって、 [要求規則の編集] ダイアログ ボックスが自動的に表示されます。

  9. [規則の追加] を選択します。

  10. [要求規則テンプレート] で、[LDAP 属性を要求として送信] を選択します。

  11. [要求規則名] を指定します。 [属性ストア] で、 [Active Directory の選択] を選択し、次の要求を追加し、 [完了][OK] の順に選択します。

    LDAP 属性 出力方向の要求の種類
    User-Principal-Name userPrincipalName
    Surname family_name
    Given-Name given_name
    E-Mail-Address email
    Display-Name name

    [出力方向の要求の種類] ドロップダウンには、一部の名前が表示されないことに注意してください。 手動で入力する必要があります (ドロップダウンは編集可能です)。

  12. 証明書の種類によっては、HASH アルゴリズムを設定する必要があります。 証明書利用者信頼 (B2C デモ) のプロパティ ウィンドウで、 [詳細] タブを選択して、 [セキュア ハッシュ アルゴリズム]SHA-256 に変更し、 [OK] を選択します。

  13. [サーバー マネージャー] で、 [ツール] を選択し、 [AD FS Management](AD FS 管理) を選択します。

  14. 作成した証明書利用者信頼を選択し、 [フェデレーション メタデータから更新] を選択し、 [更新] を選択します。

カスタム ポリシーのテスト

  1. Azure portal にサインインします。
  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
  3. Azure portal で、 [Azure AD B2C] を検索して選択します。
  4. [ポリシー][Identity Experience Framework] を選択します。
  5. 証明書利用者ポリシー (B2C_1A_signup_signin など) を選択します。
  6. [アプリケーション] には、前に登録した Web アプリケーションを選択します。 [応答 URL]https://jwt.ms と表示されます。
  7. [今すぐ実行] ボタンを選択します。
  8. サインアップまたはサインイン ページで、 [Contoso AD FS] を選択して Contoso AD FS ID プロバイダーでサインインします。

サインイン プロセスが成功すると、ブラウザーは https://jwt.ms にリダイレクトされ、Azure AD B2C によって返されたトークンの内容が表示されます。

AD FS サービスのトラブルシューティング

AD FS は、Windows アプリケーション ログを使用するように構成されています。 Azure AD B2C でカスタム ポリシーを使用して SAML ID プロバイダーとして AD FS を設定するときに問題が発生した場合は、次のように AD FS イベント ログを確認してください。

  1. Windows の [検索バー] に「イベント ビューアー」と入力し、イベント ビューアー デスクトップ アプリを選択します。
  2. 別のコンピューターのログを表示するには、 [イベント ビューアー (ローカル)] を右クリックします。 [別のコンピューターへ接続] を選択し、フィールドに入力して [コンピューターの選択] ダイアログ ボックスの設定を完了します。
  3. イベント ビューアーで、 [アプリケーションとサービス ログ] を開きます。
  4. [AD FS][管理者] の順に選択します。
  5. イベントについての詳細情報を表示するには、イベントをダブルクリックします。

SAML 要求が、必要な署名アルゴリズム イベントで署名されていない

このエラーは、Azure AD B2C によって送信された SAML 要求が、AD FS で構成されている必要な署名アルゴリズムで署名されていないことを示します。 たとえば、SAML 要求は署名アルゴリズム rsa-sha256 で署名されていますが、必要な署名アルゴリズムは rsa-sha1 です。 この問題を解決するには、Azure AD B2C と AD FS の両方が同じ署名アルゴリズムで構成されていることを確認してください。

オプション 1: Azure AD B2C で署名アルゴリズムを設定する

Azure AD B2C で SAML 要求に署名する方法を構成できます。 XmlSignatureAlgorithm メタデータは、SAML 要求の SigAlg パラメーター (クエリ文字列または post パラメーター) の値を制御します。 次の例では、rsa-sha256 署名アルゴリズムを使用するように Azure AD B2C を構成します。

<Metadata>
  <Item Key="WantsEncryptedAssertions">false</Item>
  <Item Key="PartnerEntity">https://your-AD-FS-domain/federationmetadata/2007-06/federationmetadata.xml</Item>
  <Item Key="XmlSignatureAlgorithm">Sha256</Item>
</Metadata>

オプション 2:AD FS で署名アルゴリズムを設定する

または、AD FS で必要な SAML 要求署名アルゴリズムを構成することもできます。

  1. [サーバー マネージャー] で、 [ツール] を選択し、 [AD FS Management](AD FS 管理) を選択します。
  2. 先ほど作成した証明書利用者信頼を選択します。
  3. [プロパティ][詳細] の順に選択します。
  4. [セキュリティで保護されたハッシュ アルゴリズム] を構成し、 [OK] を選択して変更を保存します。

HTTP リダイレクト要求には、署名された要求に必要なパラメーター 'Signature が含まれていません (AADB2C90168)

オプション 1: Azure AD B2C で ResponsesSigned を false に設定する

Azure AD B2C で署名付きメッセージの要件を無効にすることができます。 次の例では、署名された要求に 'Signature' パラメーターを必要としないように Azure AD B2C を構成します。

<Metadata>
  <Item Key="WantsEncryptedAssertions">false</Item>
  <Item Key="PartnerEntity">https://your-AD-FS-domain/federationmetadata/2007-06/federationmetadata.xml</Item>
  <Item Key="ResponsesSigned">false</Item>
</Metadata>

オプション 2: メッセージとアサーションの両方に署名するように AD FS で証明書利用者を設定する

または、次に示す方法で証明書利用者 AD FS を構成できます。

  1. 管理者として PowerShell を開き、コマンドレット Set-AdfsRelyingPartyTrust -TargetName <RP Name> -SamlResponseSignature MessageAndAssertion を実行してメッセージとアサーションの両方に署名します。
  2. Set-AdfsRelyingPartyTrust -TargetName <RP Name> を実行し、SamlResponseSignature プロパティが MessageAndAssertion として設定されていることを確認します。