【问题标题】:How can I get a value of an open / directory extension in an Azure AD B2C custom policy?如何在 Azure AD B2C 自定义策略中获取打开/目录扩展的值?
【发布时间】:2022-11-21 17:38:43
【问题描述】:

我正在使用 Microsoft Graph API 为用户设置自定义值(字符串)。 我试过同时使用开放和目录扩展来存储数据,并且两者似乎在 API 级别都运行良好,因为我能够将数据返回给用户。

接下来我要做的是将此扩展的价值纳入 B2C 自定义政策声明。我一直无法找到任何文档来说明如何在自定义策略中获取开放扩展的值,即使文档声明它是受支持的,所以我尝试使用目录扩展来做到这一点。

扩展名是 extension_{appId}_myString 并且是通过这个 HTTP 调用创建的:

POST https://graph.microsoft.com/v1.0/applications/graph-app-object-id/extensionProperties

{
    "name": "myString",
    "dataType": "String",
    "targetObjects": [
        "User"
    ]
}

我添加了声明类型定义如下:

<ClaimType Id="myString">
    <DisplayName>This is my string</DisplayName>
    <DataType>string</DataType>
    <DefaultPartnerClaimTypes>
        <Protocol Name="OpenIdConnect" PartnerClaimType="extension_myString" />
        <Protocol Name="OAuth2" PartnerClaimType="extension_myString" />
    </DefaultPartnerClaimTypes>
</ClaimType>

我的用户旅程定义:

<UserJourney Id="SignIn">
    <OrchestrationSteps>
        <OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.selfasserted">
            <ClaimsProviderSelections>
                <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninExchange" />
            </ClaimsProviderSelections>
            <ClaimsExchanges>
                 <ClaimsExchange Id="LocalAccountSigninExchange" TechnicalProfileReferenceId="LocalAccountDiscoveryUsingID" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="2" Type="ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
    </OrchestrationSteps>
    <ClientDefinition ReferenceId="DefaultWeb" />
</UserJourney>

我在第 1 步和第 2 步的技术配置文件中添加了此输出声明:

<OutputClaim ClaimTypeReferenceId="myString" PartnerClaimType="extension_myString" />

我的 AAD-Common 技术配置文件具有 b2c-extensions-app 客户端 ID 和对象 ID 元数据项,我能够成功完成身份验证过程并进入 JWT 屏幕,但我的扩展值未显示在那里。

我不明白我是不是做错了什么,或者只是错过了另一个应该添加自定义声明以使其显示在令牌中的地方。有没有某种方法可以“打印”声明的值以查看它是否存在于策略的运行时中?至少我知道价值在那里,我只需要把它放在代币中..

我不确定的另一件事是通过 Graph API 创建扩展值。我使用图形应用程序的凭据获取图形 API 令牌,还使用它的对象 ID 在用户对象上创建目录扩展。另一方面,有 b2c-extensions-app,它是在自定义策略运行时查询数据的应用程序。根据我的理解,这两个应用程序都针对同一个 Active Directory 实例工作,所以这应该不是问题,但也许我误解了一些东西。

【问题讨论】:

    标签: azure-active-directory azure-ad-b2c azure-ad-b2c-custom-policy


    【解决方案1】:

    要在 Azure B2C 自定义配置文件中配置自定义声明,根据 https://learn.microsoft.com/en-us/azure/active-directory-b2c/user-flow-custom-attributes?pivots=b2c-custom-policy#create-a-custom-attribute-through-azure-portal,您必须在声明类型 ID 前加上前缀扩大_允许正确的数据映射

    • 在 Claims Schema 中,声明应定义为:

    • 以下示例演示了在技术配置文件、输入、输出和持久声明中使用 Azure AD B2C 自定义策略中的自定义属性。

    谢谢

    【讨论】:

    • 我也试过这个但没有成功。我认为这与我如何通过 Graph API 创建目录扩展有关。即使应该支持,也没有关于如何获取开放扩展值的文档:learn.microsoft.com/en-us/graph/…
    • 您是否也向依赖方部分添加了输出声明?
    【解决方案2】:

    你不能。 MS Graph API 支持开放扩展。 B2C 策略在后台使用 AAD Graph,它只能获取旧的扩展属性类型。要获取一个开放的扩展,你必须调用你自己的 api,它又调用 MS Graph API 来获取这个开放的扩展。

    而不是使用开放扩展使用旧类型:

    https://learn.microsoft.com/en-us/azure/active-directory-b2c/microsoft-graph-operations#application-extension-directory-extension-properties

    https://learn.microsoft.com/en-us/graph/api/resources/extensionproperty?view=graph-rest-1.0

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      相关资源
      最近更新 更多