UserInfo エンドポイント

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

UserInfo エンドポイントは、OpenID Connect 標準 (OIDC) 仕様の一部で、認証されたユーザーに関する要求を返すためのものです。 UserInfo エンドポイントは、EndPoint 要素を使用して、証明書利用者ポリシーで定義されます。

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

前提条件

UserInfo エンドポイントの概要

ユーザー情報の UserJourney では、次の点を指定します。

  • 承認: UserInfo エンドポイントは、ベアラー トークンで保護されています。 発行されたアクセス トークンは、UserInfo エンドポイントへの Authorization ヘッダーに示されます。 このポリシーは、受信トークンを検証し、ユーザーの objectId などの要求を抽出する技術プロファイルを指定します。 ユーザーの objectId は、UserInfo エンドポイント過程の応答で返されるために、要求の取得に使用されます。
  • オーケストレーション ステップ:
    • オーケストレーション ステップは、ユーザーに関する情報を収集するために使用されます。 ユーザー体験は、受信アクセス トークン内の要求に基づいて、Microsoft Entra ID 技術プロファイルを呼び出して、たとえば、objectId によってユーザーを読み取るなどユーザーに関するデータを取得します。
    • 省略可能なオーケストレーション手順 - REST API の技術プロファイルなど、ユーザーに関する詳細情報を取得するためのオーケストレーション手順を追加できます。
    • UserInfo 発行者 - UserInfo エンドポイントが返す要求の一覧を指定します。

UserInfo エンドポイントを作成する

1.トークン発行者の技術プロファイルを追加する

  1. TrustFrameworkExtensions.xml ファイルを開きます。

  2. まだ存在しない場合は、ClaimsProvider 要素とその子要素を、BuildingBlocks 要素の下の最初の要素として追加します。

  3. 次のクレーム プロバイダーを追加します。

    <!-- 
    <ClaimsProviders> -->
      <ClaimsProvider>
        <DisplayName>Token Issuer</DisplayName>
        <TechnicalProfiles>
          <TechnicalProfile Id="UserInfoIssuer">
            <DisplayName>JSON Issuer</DisplayName>
            <Protocol Name="None" />
            <OutputTokenFormat>JSON</OutputTokenFormat>
            <CryptographicKeys>
              <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
            </CryptographicKeys>
            <!-- The Below claims are what will be returned on the UserInfo Endpoint if in the Claims Bag-->
            <InputClaims>
              <InputClaim ClaimTypeReferenceId="objectId"/>
              <InputClaim ClaimTypeReferenceId="givenName"/>
              <InputClaim ClaimTypeReferenceId="surname"/>
              <InputClaim ClaimTypeReferenceId="displayName"/>
              <InputClaim ClaimTypeReferenceId="signInNames.emailAddress"/>
            </InputClaims>
          </TechnicalProfile>
          <TechnicalProfile Id="UserInfoAuthorization">
            <DisplayName>UserInfo authorization</DisplayName>
            <Protocol Name="None" />
            <InputTokenFormat>JWT</InputTokenFormat>
            <Metadata>
              <!-- Update the Issuer and Audience below -->
              <!-- Audience is optional, Issuer is required-->
              <Item Key="issuer">https://yourtenant.b2clogin.com/11111111-1111-1111-1111-111111111111/v2.0/</Item>
              <Item Key="audience">[ "22222222-2222-2222-2222-222222222222", "33333333-3333-3333-3333-333333333333" ]</Item>
              <Item Key="client_assertion_type">urn:ietf:params:oauth:client-assertion-type:jwt-bearer</Item>
            </Metadata>
            <CryptographicKeys>
              <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
            </CryptographicKeys>
            <OutputClaims>
              <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
              <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email"/>
              <!-- Optional claims to read from the access token. -->
              <!-- <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name"/>
                 <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="family_name"/>
                 <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name"/> -->
            </OutputClaims>
          </TechnicalProfile>
        </TechnicalProfiles>
      </ClaimsProvider>
    <!-- 
    </ClaimsProviders> -->
    
  4. UserInfoIssuer 技術プロファイル内の IutputClaims セクションは、返される属性を指定します。 UserInfoIssuer 技術プロファイルは、ユーザー体験の最後に呼び出されます。

  5. UserInfoAuthorization 技術プロファイルは、署名、発行者名、トークン対象ユーザーを検証し、受信トークンから要求を抽出します。 環境に合わせて次のメタデータを変更します。

    1. 発行者 - この値は、アクセス トークン要求内の iss 要求と同じである必要があります。 Azure AD B2C によって発行されたトークンは、形式 https://yourtenant.b2clogin.com/your-tenant-id/v2.0/ の発行者を使用します。 詳細については、トークン カスタマイズに関するページをご覧ください。

    2. IdTokenAudience - この値は、アクセス トークン要求内の aud 要求と同じである必要があります。 Azure AD B2C では、aud 要求は、証明書利用者アプリケーションの ID です。 この値はコレクションであり、コンマ区切り記号を使用して複数の値をサポートします。

      次のアクセス トークンでは、iss 要求の値は https://contoso.b2clogin.com/11111111-1111-1111-1111-111111111111/v2.0/ です。 aud 要求の値は 22222222-2222-2222-2222-222222222222 です。

      {
        "exp": 1605549468,
        "nbf": 1605545868,
        "ver": "1.0",
        "iss": "https://contoso.b2clogin.com/11111111-1111-1111-1111-111111111111/v2.0/",
        "sub": "44444444-4444-4444-4444-444444444444",
        "aud": "22222222-2222-2222-2222-222222222222",
        "acr": "b2c_1a_signup_signin",
        "nonce": "defaultNonce",
        "iat": 1605545868,
        "auth_time": 1605545868,
        "name": "John Smith",
        "given_name": "John",
        "family_name": "Smith",
        "tid": "11111111-1111-1111-1111-111111111111"
      }
      
  6. UserInfoAuthorization 技術プロファイルの OutputClaims 要素は、アクセス トークンから読み取る属性を指定します。 ClaimTypeReferenceId は、要求の種類への参照です。 省略可能な PartnerClaimType は、アクセス トークンで定義されている要求の名前です。

2.UserJourney 要素を追加します

UserJourney 要素は、ユーザーがアプリケーションとやり取りするときに取るパスを定義します。 UserInfoJourney として識別される UserJourney に存在していない場合は、UserJourneys 要素を追加します。

<!-- 
<UserJourneys> -->
  <UserJourney Id="UserInfoJourney" DefaultCpimIssuerTechnicalProfileReferenceId="UserInfoIssuer">
    <Authorization>
      <AuthorizationTechnicalProfiles>
        <AuthorizationTechnicalProfile ReferenceId="UserInfoAuthorization" />
      </AuthorizationTechnicalProfiles>
    </Authorization>
    <OrchestrationSteps >
      <OrchestrationStep Order="1" Type="ClaimsExchange">
        <Preconditions>
          <Precondition Type="ClaimsExist" ExecuteActionsIf="false">
            <Value>objectId</Value>
            <Action>SkipThisOrchestrationStep</Action>
          </Precondition>
        </Preconditions>
        <ClaimsExchanges UserIdentity="false">
          <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
        </ClaimsExchanges>
      </OrchestrationStep>
      <OrchestrationStep Order="2" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="UserInfoIssuer" />
    </OrchestrationSteps>
  </UserJourney>
<!-- 
</UserJourneys> -->

3.証明書利用者ポリシーにエンドポイントを含める

証明書利用者アプリケーションに UserInfo エンドポイントを追加するには、Endpoint 要素を SocialAndLocalAccounts/SignUpOrSignIn.xml ファイルに追加します。

<!--
<RelyingParty> -->
  <Endpoints>
    <Endpoint Id="UserInfo" UserJourneyReferenceId="UserInfoJourney" />
  </Endpoints>
<!-- 
</RelyingParty> -->

完成した証明書利用者要素は次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TrustFrameworkPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06" PolicySchemaVersion="0.3.0.0" TenantId="yourtenant.onmicrosoft.com" PolicyId="B2C_1A_signup_signin" PublicPolicyUri="http://yourtenant.onmicrosoft.com/B2C_1A_signup_signin">
  <BasePolicy>
    <TenantId>yourtenant.onmicrosoft.com</TenantId>
    <PolicyId>B2C_1A_TrustFrameworkExtensions</PolicyId>
  </BasePolicy>
  <RelyingParty>
    <DefaultUserJourney ReferenceId="SignUpOrSignIn" />
    <Endpoints>
      <Endpoint Id="UserInfo" UserJourneyReferenceId="UserInfoJourney" />
    </Endpoints>
    <TechnicalProfile Id="PolicyProfile">
      <DisplayName>PolicyProfile</DisplayName>
      <Protocol Name="OpenIdConnect" />
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="displayName" />
        <OutputClaim ClaimTypeReferenceId="givenName" />
        <OutputClaim ClaimTypeReferenceId="surname" />
        <OutputClaim ClaimTypeReferenceId="email" />
        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
        <OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" />
      </OutputClaims>
      <SubjectNamingInfo ClaimType="sub" />
    </TechnicalProfile>
  </RelyingParty>
</TrustFrameworkPolicy>

4.ファイルのアップロード

  1. Azure portal にサインインします。
  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
  3. Azure portal の左上隅にある [すべてのサービス] を選択してから、 [Azure AD B2C] を検索して選択します。
  4. [Identity Experience Framework] を選択します。
  5. [カスタム ポリシー] ページで、 [カスタムポリシーのアップロード] を選択します。
  6. [カスタム ポリシーが既に存在する場合は上書きする] を選択し、TrustframeworkExtensions.xml ファイルを検索して選択します。
  7. [アップロード] をクリックします。
  8. その証明書利用者ファイル (SignUpOrSignIn.xml など) で、手順 5 から 7 を繰り返します。

UserInfo エンドポイントを呼び出す

UserInfo エンドポイントは、アプリケーションのトークンを取得するときに受信したアクセス トークンを使用して呼び出される標準の OAuth2 ベアラー トークン API を利用します。 これにより、ユーザーに関する要求が含まれる JSON 応答が返されます。 UserInfo エンドポイントは、次の場所にある Azure AD B2C でホストされます。

https://yourtenant.b2clogin.com/yourtenant.onmicrosoft.com/policy-name/openid/v2.0/userinfo

/.well-known 構成エンドポイント (OpenID Connect 検出ドキュメント) に userinfo_endpoint フィールドが一覧表示されます。 UserInfo エンドポイントは、プログラムを使って検出することができます。具体的には、次の場所にある/.well-known 構成エンドポイントを使用します。

https://yourtenant.b2clogin.com/yourtenant.onmicrosoft.com/policy-name/v2.0/.well-known/openid-configuration 

ポリシーをテストする

  1. [カスタム ポリシー] の下で、UserInfo エンドポイントを統合したポリシーを選択します。 たとえば、B2C_1A_SignUpOrSignIn などです。
  2. [今すぐ実行] を選択します。
  3. [アプリケーションの選択] の下で、前に登録したアプリケーションを選択します。 [応答 URL の選択] で、https://jwt.ms を選択します。 詳細については、「Azure Active Directory B2C に Web アプリケーションを登録する」をご覧ください。
  4. メール アドレスまたはソーシャル アカウントを使用してサインアップまたはサインインします。
  5. https://jwt.ms Web サイトから、id_token をエンコードされた形式でコピーします。 これを使用して、UserInfo エンドポイントに GET 要求を送信して、ユーザー情報を取得できます。
  6. GET 要求を UserInfo エンドポイントに送信し、ユーザー情報を取得します。
GET /yourtenant.onmicrosoft.com/b2c_1a_signup_signin/openid/v2.0/userinfo
Host: b2cninja.b2clogin.com
Authorization: Bearer <your access token>

正常な応答は次のようになります。

{
    "objectId": "44444444-4444-4444-4444-444444444444",
    "givenName": "John",
    "surname": "Smith",
    "displayName": "John Smith",
    "signInNames.emailAddress": "john.s@contoso.com"
}

省略可能な要求を指定する

アプリにその他の要求を指定するには、次の手順を実行します。

  1. ユーザー属性を追加してユーザー入力をカスタマイズします

  2. 証明書利用者ポリシーの技術プロファイルの OutputClaims 要素を、指定する要求を使用して変更します。 DefaultValue 属性を使用して既定値を設定します。 また、{Context:CorrelationId} など、要求リゾルバーに対する既定値も設定できます。 既定値を強制的に使用するには、AlwaysUseDefaultValue 属性を true に設定します。 次の例では、既定値の city 要求を追加しています。

    <RelyingParty>
      ...
      <TechnicalProfile Id="PolicyProfile">
        ...
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="city" DefaultValue="Berlin" />
        </OutputClaims>
        ...
      </TechnicalProfile>
    </RelyingParty>
    
  3. UserInfoIssuer 技術プロファイルの InputClaims 要素を、指定する要求を使用して変更します。 PartnerClaimType 属性を使用して、アプリに返す要求の名前を変更します。 次の例では、city 要求を追加し、一部の要求の名前を変更しています。

    <TechnicalProfile Id="UserInfoIssuer">
      ...
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="objectId" />
        <InputClaim ClaimTypeReferenceId="city" />
        <InputClaim ClaimTypeReferenceId="givenName" />
        <InputClaim ClaimTypeReferenceId="surname" PartnerClaimType="familyName" />
        <InputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
        <InputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
      </InputClaims>
      ...
    </TechnicalProfile>
    

次の手順

  • UserInfo エンドポイントの例については、GitHub を参照してください。