UserInfo エンドポイント
開始する前にこのページの上部にある ポリシーの種類 セレクターを使用して、設定するポリシーの種類を選択します。 Azure Active Directory B2C には、ユーザーがアプリケーションを操作する方法を定義する 2 つの方法 (定義済みのユーザー フローを使用する、または完全に構成可能なカスタム ポリシーを使用する) があります。 この記事で必要な手順は、方法ごとに異なります。
UserInfo エンドポイントは、OpenID Connect 標準 (OIDC) 仕様の一部で、認証されたユーザーに関する要求を返すためのものです。 UserInfo エンドポイントは、EndPoint 要素を使用して、証明書利用者ポリシーで定義されます。
この機能は、カスタム ポリシーでのみ使用できます。 セットアップ手順は、前のセレクターで [カスタム ポリシー] を選択します。
前提条件
- 「Active Directory B2C でのカスタム ポリシーの概要」にある手順を完了する。 このチュートリアルでは、Azure AD B2C テナント構成を使用するようにカスタム ポリシー ファイルを更新する方法について説明します。
- Web アプリを登録していない場合は、Web アプリケーションを登録の手順に従って登録します。
UserInfo エンドポイントの概要
ユーザー情報の UserJourney では、次の点を指定します。
- 承認: UserInfo エンドポイントは、ベアラー トークンで保護されています。 発行されたアクセス トークンは、UserInfo エンドポイントへの Authorization ヘッダーに示されます。 このポリシーは、受信トークンを検証し、ユーザーの objectId などの要求を抽出する技術プロファイルを指定します。 ユーザーの objectId は、UserInfo エンドポイント過程の応答で返されるために、要求の取得に使用されます。
- オーケストレーション ステップ:
- オーケストレーション ステップは、ユーザーに関する情報を収集するために使用されます。 ユーザー体験は、受信アクセス トークン内の要求に基づいて、Microsoft Entra ID 技術プロファイルを呼び出して、たとえば、objectId によってユーザーを読み取るなどユーザーに関するデータを取得します。
- 省略可能なオーケストレーション手順 - REST API の技術プロファイルなど、ユーザーに関する詳細情報を取得するためのオーケストレーション手順を追加できます。
- UserInfo 発行者 - UserInfo エンドポイントが返す要求の一覧を指定します。
UserInfo エンドポイントを作成する
1.トークン発行者の技術プロファイルを追加する
TrustFrameworkExtensions.xml ファイルを開きます。
まだ存在しない場合は、ClaimsProvider 要素とその子要素を、BuildingBlocks 要素の下の最初の要素として追加します。
次のクレーム プロバイダーを追加します。
<!-- <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/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/</Item> <Item Key="audience">[ "00001111-aaaa-2222-bbbb-3333cccc4444", "11112222-bbbb-3333-cccc-4444dddd5555" ]</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> -->
UserInfoIssuer 技術プロファイル内の IutputClaims セクションは、返される属性を指定します。 UserInfoIssuer 技術プロファイルは、ユーザー体験の最後に呼び出されます。
UserInfoAuthorization 技術プロファイルは、署名、発行者名、トークン対象ユーザーを検証し、受信トークンから要求を抽出します。 環境に合わせて次のメタデータを変更します。
発行者 - この値は、アクセス トークン要求内の
iss
要求と同じである必要があります。 Azure AD B2C によって発行されたトークンは、形式https://yourtenant.b2clogin.com/your-tenant-id/v2.0/
の発行者を使用します。 詳細については、トークン カスタマイズに関するページをご覧ください。IdTokenAudience - この値は、アクセス トークン要求内の
aud
要求と同じである必要があります。 Azure AD B2C では、aud
要求は、証明書利用者アプリケーションの ID です。 この値はコレクションであり、コンマ区切り記号を使用して複数の値をサポートします。次のアクセス トークンでは、
iss
要求の値はhttps://contoso.b2clogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/
です。aud
要求の値は00001111-aaaa-2222-bbbb-3333cccc4444
です。{ "exp": 1605549468, "nbf": 1605545868, "ver": "1.0", "iss": "https://contoso.b2clogin.com/11111111-1111-1111-1111-111111111111/v2.0/", "sub": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "aud": "00001111-aaaa-2222-bbbb-3333cccc4444", "acr": "b2c_1a_signup_signin", "nonce": "defaultNonce", "iat": 1605545868, "auth_time": 1605545868, "name": "John Smith", "given_name": "John", "family_name": "Smith", "tid": "aaaabbbb-0000-cccc-1111-dddd2222eeee" }
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.ファイルのアップロード
- Azure portal にサインインします。
- 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
- Azure portal の左上隅にある [すべてのサービス] を選択してから、 [Azure AD B2C] を検索して選択します。
- [Identity Experience Framework] を選択します。
- [カスタム ポリシー] ページで、 [カスタムポリシーのアップロード] を選択します。
- [カスタム ポリシーが既に存在する場合は上書きする] を選択し、TrustframeworkExtensions.xml ファイルを検索して選択します。
- [アップロード] をクリックします。
- その証明書利用者ファイル (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
ポリシーをテストする
- [カスタム ポリシー] の下で、UserInfo エンドポイントを統合したポリシーを選択します。 たとえば、B2C_1A_SignUpOrSignIn などです。
- [今すぐ実行] を選択します。
- [アプリケーションの選択] の下で、前に登録したアプリケーションを選択します。 [応答 URL の選択] で、
https://jwt.ms
を選択します。 詳細については、「Azure Active Directory B2C に Web アプリケーションを登録する」をご覧ください。 - メール アドレスまたはソーシャル アカウントを使用してサインアップまたはサインインします。
- https://jwt.ms Web サイトから、id_token をエンコードされた形式でコピーします。 これを使用して、UserInfo エンドポイントに GET 要求を送信して、ユーザー情報を取得できます。
- GET 要求を UserInfo エンドポイントに送信し、ユーザー情報を取得します。
GET /yourtenant.onmicrosoft.com/b2c_1a_signup_signin/openid/v2.0/userinfo
Host: b2cninja.b2clogin.com
Authorization: Bearer <your access token>
正常な応答は次のようになります。
{
"objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
"givenName": "John",
"surname": "Smith",
"displayName": "John Smith",
"signInNames.emailAddress": "john.s@contoso.com"
}
省略可能な要求を指定する
アプリにその他の要求を指定するには、次の手順を実行します。
証明書利用者ポリシーの技術プロファイルの OutputClaims 要素を、指定する要求を使用して変更します。
DefaultValue
属性を使用して既定値を設定します。 また、{Context:CorrelationId}
など、要求リゾルバーに対する既定値も設定できます。 既定値を強制的に使用するには、AlwaysUseDefaultValue
属性をtrue
に設定します。 次の例では、既定値の city 要求を追加しています。<RelyingParty> ... <TechnicalProfile Id="PolicyProfile"> ... <OutputClaims> <OutputClaim ClaimTypeReferenceId="city" DefaultValue="Berlin" /> </OutputClaims> ... </TechnicalProfile> </RelyingParty>
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 を参照してください。