我正在使用Azure AD B2C和自定义策略来管理用户并提供登录体验。我注意到有一个内置的(不是自定义扩展名)属性名称companyName,我正在使用用户的公司信息进行更新。我可以通过图形API更新此字段值并分别检索它。一旦更新此值,我将尝试将其包含在声明中并发送给客户端应用程序,但是我遇到了问题。我已确保在TrustFrameworkBase政策中加入如下声明
<ClaimType Id="companyName">
<DisplayName>companyName</DisplayName>
<DataType>string</DataType>
</ClaimType>
我还更新了AAD-UserReadUsingObjectId技术配置文件,该文件负责进行图形调用(成功认证之后)并获取所有用户属性。这是AAD-UserReadUsingObjectId技术资料的定义
<TechnicalProfile Id="AAD-UserReadUsingObjectId">
<Metadata>
<Item Key="Operation">Read</Item>
<Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
</Metadata>
<IncludeInSso>false</IncludeInSso>
<InputClaims>
<InputClaim ClaimTypeReferenceId="objectId" Required="true" />
</InputClaims>
<OutputClaims>
<!-- Optional claims -->
<OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" />
<OutputClaim ClaimTypeReferenceId="displayName" />
<OutputClaim ClaimTypeReferenceId="mobile" />
<OutputClaim ClaimTypeReferenceId="country" />
<OutputClaim ClaimTypeReferenceId="postalCode" />
<OutputClaim ClaimTypeReferenceId="state" />
<OutputClaim ClaimTypeReferenceId="company" />
<OutputClaim ClaimTypeReferenceId="companyName" />
<OutputClaim ClaimTypeReferenceId="surname" />
<OutputClaim ClaimTypeReferenceId="givenName" />
<OutputClaim ClaimTypeReferenceId="email" />
<OutputClaim ClaimTypeReferenceId="objectId" />
<!--Adding custom attribute start-->
<OutputClaim ClaimTypeReferenceId="otherMails" />
<OutputClaim ClaimTypeReferenceId="extension_UserGuid" />
<OutputClaim ClaimTypeReferenceId="extension_StatusFlag" />
<OutputClaim ClaimTypeReferenceId="extension_EZUserName" />
<OutputClaim ClaimTypeReferenceId="CurrentTime" />
<!--Adding custom attribute end-->
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="GetSystemDateTime" />
</OutputClaimsTransformations>
<IncludeTechnicalProfile ReferenceId="AAD-Common" />
</TechnicalProfile>
最后,我将这个companyName声明包括在用户旅程输出声明中。
即使在完成所有这些操作后,我仍然注意到companyName声明不在天蓝色AD B2C返回的令牌内。 为了进一步排除故障,我为我的策略启用了应用程序洞察力,并且观察到了奇怪的行为。
Azure AD B2C在执行 AAD-UserReadUsingObjectId 技术配置文件时进行图形调用时,它会形成如下查询 https://graph.windows.net/f17d6207-7c3a-4d29-b802-ad5429b2a8d8/users/77669822-8034-4666-9800-8b614c0ccbfc?api-version=1.6-integrationOnly 并且此图形api调用的输出根本不包含companyName属性,但是当我使用我的应用程序ID和密码进行具有类似查询的图形api调用时,我确实在响应中看到companyName。我在哪个Azure AD B2C调用中查询的唯一区别是在api URL中调用了最后一部分。我不知道,Azure AD B2C在最后只有 -integration 。我不确定为什么Azure AD B2C进行图形API调用时与我进行图形API调用的响应不同。
我可以通过简单地添加一个新的自定义扩展字段并使用它而不是companyName来解决此问题,但是我的意思是为什么当我提供一个自定义属性时,我应该创建一个自定义属性,更重要的是,这将需要我修复大约一百万的现有用户。 有没有人遇到过这类问题。任何帮助都会很棒!
预先感谢!
答案 0 :(得分:0)
CompanyName是O365的内置属性。如您所见,B2C在后端使用仅集成api版本进行自己的调用。唯一的解决方案是使用扩展属性。修补用户的脚本可以在12小时内修复100万用户。 使用自定义策略时,坚持使用自己的自定义属性,尝试使用默认属性名称并没有真正的好处,只有有时会发现缺点。自定义策略只需要您将属性名称声明为extension_,就可以像任何内置属性一样工作。