You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure AD B2C模拟自定义策略:能否返回被模拟用户非邮箱属性?

问题描述

已成功部署基础用户模拟自定义策略,设置can_impersonate属性为true的管理员可模拟目标用户,被模拟用户的邮箱能正常返回至impersonatedUser Claim中。

新增Claim字段impersonatedUserContactId,期望其对应被模拟用户的displayName,但该字段始终为空。核心配置如下:

Claims Types

<ClaimType Id="impersonatedUser">
  <DisplayName>Impersonated account</DisplayName>
  <DataType>string</DataType>
  <UserHelpText/>
</ClaimType>
<ClaimType Id="impersonatedUserContactId">
  <DisplayName>Impersonated account Contact Id</DisplayName>
  <DataType>string</DataType>
  <UserHelpText/>
</ClaimType>

Technical Profile AAD-ImpersonatedUserRead

<TechnicalProfile Id="AAD-ImpersonatedUserRead">
  <Metadata>
    <Item Key="Operation">Read</Item>
    <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
    <Item Key="UserMessageIfClaimsPrincipalDoesNotExist">An account could not be found for the provided user ID.</Item>
    <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item>
  </Metadata>
  <IncludeInSso>false</IncludeInSso>
  <InputClaims>
    <!--Sample: Look up in the signInNames to see if the value in targetEmail contains - look it up-->
    <InputClaim ClaimTypeReferenceId="targetEmail" PartnerClaimType="signInNames.emailAddress" Required="true"/>
  </InputClaims>
  <OutputClaims>
    <!-- Sample: Returns the value in targetEmail and check in signInNames collection, then
         returns value in SignInName and pipe into impersonatedUser-->
    <OutputClaim ClaimTypeReferenceId="impersonatedUser" PartnerClaimType="signInNames.emailAddress" />
    <OutputClaim ClaimTypeReferenceId="impersonatedUserContactId" PartnerClaimType="displayName"/>
  </OutputClaims>
  <IncludeTechnicalProfile ReferenceId="AAD-Common"/>
</TechnicalProfile>

Technical Profile SelfAsserted-TargetEmailExchange

<TechnicalProfile Id="SelfAsserted-TargetEmailExchange">
  <DisplayName>Target Email Page</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  <Metadata>
    <Item Key="ContentDefinitionReferenceId">api.selfasserted</Item> 
    <!--Sample:  indicating that claim resolving should be performed. So, we can read the value of {OAUTH-KV:targetEmail} claim resolver -->
    <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item>
  </Metadata>
  <InputClaims>
    <!--Sample: read the targetEmail query string parameter e.g. &targetemail=bob@contoso.com -->
    <InputClaim ClaimTypeReferenceId="targetEmail" DefaultValue="{OAUTH-KV:targetEmail}" AlwaysUseDefaultValue="true"/>
  </InputClaims>
  <OutputClaims>
    <!-- Required claims -->
    <OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true"/>
    <OutputClaim ClaimTypeReferenceId="impersonatedUser" Required="true"/>
    <OutputClaim ClaimTypeReferenceId="impersonatedUserContactId" Required="true" />
    <OutputClaim ClaimTypeReferenceId="targetEmail" Required="true"/>
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AAD-ImpersonatedUserRead"/>
  </ValidationTechnicalProfiles>
</TechnicalProfile>

impersonatedUser和impersonatedUserContactId已添加至依赖方配置,但impersonatedUserContactId始终为空。请问是否可通过模拟策略返回用户邮箱以外的属性?如何解决?


解决方案

可以通过模拟策略返回邮箱以外的用户属性,问题根源在于配置中的权限映射和必填设置冲突,按以下步骤修正:

1. 确保AAD-Common拥有读取权限

在AAD-Common技术配置文件的<Metadata>中添加以下项,确保能读取用户属性:

<Item Key="ReadClaimsOnBehalfOf">true</Item>
<Item Key="ClientId">你的B2C扩展应用客户端ID</Item>

2. 修正AAD-ImpersonatedUserRead的输出声明

明确指定displayName的映射规则,添加AlwaysUseDefaultValue="true"确保值被正确传递:

<OutputClaims>
  <OutputClaim ClaimTypeReferenceId="impersonatedUser" PartnerClaimType="signInNames.emailAddress" />
  <OutputClaim ClaimTypeReferenceId="impersonatedUserContactId" PartnerClaimType="displayName" AlwaysUseDefaultValue="true"/>
</OutputClaims>

3. 移除SelfAsserted-TargetEmailExchange的不必要必填设置

impersonatedUserContactId是由验证步骤返回的,不是用户输入项,因此移除Required="true":

<OutputClaims>
  <!-- Required claims -->
  <OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true"/>
  <OutputClaim ClaimTypeReferenceId="impersonatedUser" Required="true"/>
  <OutputClaim ClaimTypeReferenceId="impersonatedUserContactId" />
  <OutputClaim ClaimTypeReferenceId="targetEmail" Required="true"/>
</OutputClaims>

4. 确认依赖方输出声明

在依赖方配置的<OutputClaims>中,确保impersonatedUserContactId被正确声明:

<OutputClaim ClaimTypeReferenceId="impersonatedUserContactId" />

5. 排查日志(可选)

若问题仍存在,开启B2C的日志功能,查看AAD-ImpersonatedUserRead的执行日志,确认是否成功读取到displayName属性。


内容的提问来源于stack exchange,提问作者jordanvector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:30:13