Azure AD B2C:无法将companyName作为令牌公开

时间:2019-12-05 16:29:48

标签: attributes azure-ad-b2c azure-ad-graph-api

我正在使用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来解决此问题,但是我的意思是为什么当我提供一个自定义属性时,我应该创建一个自定义属性,更重要的是,这将需要我修复大约一百万的现有用户。 有没有人遇到过这类问题。任何帮助都会很棒!

预先感谢!

1 个答案:

答案 0 :(得分:0)

CompanyName是O365的内置属性。如您所见,B2C在后端使用仅集成api版本进行自己的调用。唯一的解决方案是使用扩展属性。修补用户的脚本可以在12小时内修复100万用户。 使用自定义策略时,坚持使用自己的自定义属性,尝试使用默认属性名称并没有真正的好处,只有有时会发现缺点。自定义策略只需要您将属性名称声明为extension_,就可以像任何内置属性一样工作。