Azure Active Directory B2C を使用して汎用 OpenID Connect でのサインアップおよびサインインを設定する

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

OpenID Connect は OAuth 2.0 を基盤として作成された認証プロトコルであり、セキュリティで保護されたユーザー サインインに使用できます。 Azure AD B2C では、このプロトコルを使用するほとんどの ID プロバイダーがサポートされています。

この記事では、カスタム OpenID Connect ID プロバイダーをユーザー フローに追加する方法について説明します。

重要

エンドポイントは、Azure AD B2C のセキュリティ要件に準拠している必要があります。 以前の TLS バージョンと暗号は非推奨です。 詳細については、Azure AD B2C の TLS および暗号スイートの要件に関するページを参照してください。

前提条件

ID プロバイダーの追加

  1. Azure AD B2C テナントの全体管理者として Azure Portal にサインインします。
  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
  3. Azure Portal の左上隅の [すべてのサービス] を選択し、 [Azure AD B2C] を検索して選択します。
  4. [ID プロバイダー] を選択してから、 [新しい OpenID Connect プロバイダー ] を選択します。
  5. [名前] を入力します。 たとえば、「Contoso」と入力します。

OpenId Connect ID プロバイダーを定義するには、それをポリシーの拡張ファイル内の ClaimsProviders 要素に追加します。

  1. TrustFrameworkExtensions.xml を開きます。

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

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

    <ClaimsProvider>
      <Domain>contoso.com</Domain>
      <DisplayName>Login with Contoso</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="Contoso-OpenIdConnect">
          <DisplayName>Contoso</DisplayName>
          <Description>Login with your Contoso account</Description>
          <Protocol Name="OpenIdConnect"/>
          <Metadata>
            <Item Key="METADATA">https://your-identity-provider.com/.well-known/openid-configuration</Item>
            <Item Key="client_id">00000000-0000-0000-0000-000000000000</Item>
            <Item Key="response_types">code</Item>
            <Item Key="scope">openid profile</Item>
            <Item Key="response_mode">form_post</Item>
            <Item Key="HttpBinding">POST</Item>
            <Item Key="UsePolicyInRedirectUri">false</Item>
          </Metadata>
          <!-- <CryptographicKeys>
            <Key Id="client_secret" StorageReferenceId="B2C_1A_ContosoSecret"/>
          </CryptographicKeys> -->
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="oid"/>
            <OutputClaim ClaimTypeReferenceId="tenantId" PartnerClaimType="tid"/>
            <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" />
            <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" />
            <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
            <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" />
            <OutputClaim ClaimTypeReferenceId="identityProvider" PartnerClaimType="iss" />
            <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid"/>
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
            <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
            <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
            <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
          </OutputClaimsTransformations>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin"/>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    

[ID プロバイダー] を構成します。

どの OpenID Connect ID プロバイダーでも、サインインを実行するために必要な情報の多くを含むメタデータ ドキュメントを記述します。 メタデータ ドキュメントには、使用する URL、サービスの公開署名キーの場所などの情報が含まれます。 OpenID Connect メタデータ ドキュメントは、常に .well-known/openid-configuration で終わるエンドポイントに配置されます。 追加する OpenID Connect ID プロバイダーについては、そのメタデータの URL を入力します。

[メタデータ URL] には、OpenID Connect メタデータ ドキュメントの URL を入力します。

<Item Key="METADATA"> 技術プロファイル メタデータで、OpenID Connect メタデータ ドキュメントの URL を入力します。

クライアントの ID とシークレット

ユーザーのサインインを許可するために、ID プロバイダーは、開発者が自身のサービスにアプリケーションを登録する必要があります。 このアプリケーションには、クライアント ID およびクライアント シークレットと呼ばれる ID があります。

クライアント シークレットはオプションです。 ただし、応答の種類code である場合は、クライアント シークレットを指定する必要があります。そのシークレットを使用して、コードがトークンと交換されます。

クライアント ID とクライアント シークレットを追加するには、これらの値を ID プロバイダーからコピーし、対応するフィールドに入力します。

<Item Key="client_id"> 技術プロファイル メタデータで、クライアント ID を入力します。

ポリシー キーを作成する

クライアント シークレットが必須である場合は、ご利用の Azure AD B2C テナントで前に記録したクライアント シークレットを格納してください。

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

  2. ご自分の Azure AD B2C テナントが含まれるディレクトリを必ず使用してください。 ポータル ツールバーの [ディレクトリ + サブスクリプション] フィルターを選択します。

  3. [ポータルの設定] | [Directories + subscriptions](ディレクトリ + サブスクリプション) ページで Azure AD B2C ディレクトリを [ディレクトリ名] リストで見つけ、 [Switch] を選択します。

  4. Azure portal の左上隅にある [すべてのサービス] を選択してから、 [Azure AD B2C] を検索して選択します。

  5. [概要] ページで、 [Identity Experience Framework] を選択します。

  6. [ポリシー キー] を選択し、 [追加] を選択します。

  7. オプションについては、Manualを選択します。

  8. ポリシー キーの名前を入力します。 たとえば、「 ContosoSecret 」のように入力します。 プレフィックス B2C_1A_ がキーの名前に自動的に追加されます。

  9. [シークレット] に、前に記録したクライアント シークレットを入力します。

  10. [キー使用法] として [Signature] を選択します。

  11. Create をクリックしてください。

  12. CryptographicKeys XML 要素で、次の要素を追加します。

    <CryptographicKeys>
      <Key Id="client_secret" StorageReferenceId="B2C_1A_ContosoSecret"/>
    </CryptographicKeys>
    

スコープ

スコープは、ID プロバイダーから収集する情報およびアクセス許可、たとえば openid profile を定義します。 ID プロバイダーから ID トークンを受け取るには、openid スコープを指定する必要があります。

ID トークンがないと、ユーザーはカスタム ID プロバイダーを使用して Azure AD B2C にサインインすることはできません。 別のスコープをスペースで区切って追加することもできます。 使用可能な他のスコープについては、カスタム ID プロバイダーのドキュメントを参照してください。

[スコープ] で、ID プロバイダーからのスコープを入力します。 たとえば、「 openid profile 」のように入力します。

<Item Key="scope"> 技術プロファイル メタデータで、ID プロバイダーからのスコープを入力します。 たとえば、「 openid profile 」のように入力します。

応答の種類

応答の種類は、最初の呼び出しで、カスタム ID プロバイダーのauthorization_endpointに送信される情報の種類を表します。 次の応答の種類を使用できます。

  • code: 承認コード フローに従って、Azure AD B2C にコードが返されます。 次に Azure AD B2C がtoken_endpointを呼び出して、トークンのコードを交換します。
  • id_token: ID トークンが、カスタム ID プロバイダーから、Azure AD B2C に返されます。

[応答の種類] で、自分の ID プロバイダー設定に従って、code または id_token を選択します。

<Item Key="response_types"> 技術プロファイル メタデータで、自分の ID プロバイダー設定に従って、code または id_token を選択します。

応答モード

応答モードは、カスタム ID プロバイダーから Azure AD B2C へのデータの返送に使用する方法を定義します。 次の応答モードを使用できます。

  • form_post: 最高のセキュリティを得るには、この応答モードをお勧めします。 この応答は、HTTP の POST メソッドによって送信され、本文には、application/x-www-form-urlencoded 形式を使用してエンコードされたコードまたはトークンが含まれます。
  • query: このコードまたはトークンは、クエリ パラメーターとして返されます。

[応答モード] で、自分の ID プロバイダー設定に従って、form_post または query を選択します。

<Item Key="response_mode"> 技術プロファイル メタデータで、自分の ID プロバイダー設定に従って、form_post または query を選択します。

ドメインのヒント

ドメインのヒントを使用して、ユーザーは利用可能な ID プロバイダーのリストから選択するのではなく、指定した ID プロバイダーのサインイン ページに直接スキップできます。

このような動作を許可にするには、ドメインのヒントの値を入力します。 カスタム ID プロバイダーにジャンプするには、サインインのために Azure AD B2C を呼び出すときに、要求の最後にパラメーター domain_hint=<domain hint value> を追加します。

[ドメイン ヒント] で、ドメイン ヒントで使用されるドメイン名を入力します。

<Domain>contoso.com</Domain> 技術プロファイル XML 要素で、ドメイン ヒントで使用されるドメイン名を入力します。 たとえば、「 contoso.com 」のように入力します。

要求のマッピング

カスタム ID プロバイダーが Azure AD B2C に ID トークンを返送した後、Azure AD B2C は、受け取ったトークンからのクレームを Azure AD B2C が認識して使用するクレームにマッピングできる必要があります。 以下の各マッピングについては、カスタム ID プロバイダーのドキュメントを参照して、ID プロバイダーのトークンに返される要求をご理解ください。

  • ユーザー ID: サインインしたユーザーの "一意の識別子" を指定する要求を入力します。
  • 表示名: ユーザーの "表示名" または "フル ネーム" を指定する要求を入力します。
  • : ユーザーの "" を指定する要求を入力します。
  • : ユーザーの "" を指定する要求を入力します。
  • メール: ユーザーの "メール アドレス" を指定する要求を入力します。

OutputClaims 要素には、ご利用の ID プロバイダーにより返されるクレームの一覧が含まれます。 ご利用のポリシーに定義されているクレームの名前を、ID プロバイダーで定義されている名前にマップします。 <OutputClaims> 要素で、ご利用の ID プロバイダーで定義されているように、対応するクレーム名を使用して PartnerClaimType 属性を構成します。

ClaimTypeReferenceId PartnerClaimType
issuerUserId サインインしたユーザーの "一意の識別子" を指定する要求を入力します。
displayName ユーザーの "表示名" または "フル ネーム" を指定する要求を入力します。
givenName ユーザーの "" を指定する要求を入力します。
surName ユーザーの "" を指定する要求を入力します。
email ユーザーの "メール アドレス" を指定する要求を入力します。
identityProvider トークン発行者名が指定されているクレームを入力します。 たとえば、「 iss 」のように入力します。 ID プロバイダーによってトークンに発行者クレームが含まれていない場合は、ご利用の ID プロバイダーの一意識別子を使用して DefaultValue 属性を設定します。 たとえば、「 DefaultValue="contoso.com" 」のように入力します。

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

  1. Azure AD B2C テナントで、 [ユーザー フロー] を選択します。
  2. ID プロバイダーを追加するユーザー フローをクリックします。
  3. [ソーシャル ID プロバイダー] の下で、追加した ID プロバイダーを選択します。 たとえば、Contoso です。
  4. [保存] を選択します。

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

  1. ポリシーをテストするには、 [ユーザー フローを実行します] を選択します。
  2. [アプリケーション] には、以前に登録した testapp1 という名前の Web アプリケーションを選択します。 [応答 URL]https://jwt.ms と表示されます。
  3. [ユーザー フローを実行します] ボタンを選択します。
  4. サインアップまたはサインイン ページで、サインインする ID プロバイダーを選択します。 たとえば、Contoso です。

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

ユーザー体験を追加する

この時点では、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-OpenIdConnect" />
  </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など) の順序でアップロードします。
  1. 証明書利用者ポリシー (B2C_1A_signup_signin など) を選択します。
  2. [アプリケーション] には、前に登録した Web アプリケーションを選択します。 [応答 URL]https://jwt.ms と表示されます。
  3. [今すぐ実行] ボタンを選択します。
  4. サインアップまたはサインイン ページで、 [Contoso] を選択して、Google アカウントでサインインします。

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

既知の問題

  • Azure AD B2C では、暗号化されたトークンを OpenID 接続 ID プロバイダーと交換するための JWE (JSON Web Encryption) はサポートされていません。

次のステップ

詳細については、OpenId Connect 技術プロファイルのリファレンス ガイドを参照してください。