【问题标题】:Azure AD B2C : Not able to expose companyName as tokenAzure AD B2C:无法将 companyName 公开为令牌
【发布时间】:2023-04-04 04:34:01
【问题描述】:

我正在使用 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 声明不在 azure 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 在末尾有 -integrationOnly,而我没有。我不确定为什么当 Azure AD B2C 制作它与我制作它时,图形 API 调用响应是不同的。

我可以通过简单地添加一个新的自定义扩展字段并使用它而不是 companyName 来解决这个问题,但我的观点是为什么我应该在提供开箱即用的自定义属性时创建一个自定义属性,更重要的是它需要我修复现有用户约 100 万。 有没有人遇到过这类问题。任何帮助都会很棒!

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢贾斯。我已经在使用内置属性方面向前迈进了一步,因此此时更改它们不是一种选择,但是对于新领域我可以做到这一点。我的主要问题是为什么仅集成 api 调用只会给出属性的子集,看起来仅集成 api 有一个需要由 MS 解决的错误,否则它可能会跳过自定义属性。正如我在我的问题中所说,这可以通过自定义属性轻松完成,但我的观点是,如果它不返回所有字段,我们如何信任仅集成的 api。我会联系 MS 寻求澄清。
    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 2017-11-23
    • 2018-01-08
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多