1

按照此示例https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-setup-aad-custom我们已成功联合 Azure AD 目录(“AD”)使用 Azure AD B2C 目录 ('B2C'),因此我们可以让社交和自我断言注册到公共应用程序,我们的工作用户也可以使用他们的正常工作 ID 登录。这很好用,为我们解决了一个复杂的场景。

在使用 B2C 保护的应用程序中,我们需要向 AD 用户显示与其工作身份相关的内容(具体来说,我们需要根据他们的工作角色过滤产品),但我们无法获得这些信息,因为注册应用程序会为用户生成一个新的 B2C 身份(实际上是他们的 AD 身份的代理)。

我们需要做的是将用户原来的 AD 身份映射到新的 B2C 身份上。AD 用户的其他属性(例如 Given Name 和 Surname)已经映射,这似乎发生在这里,在ClaimsProvider我们的自定义策略的元素中,通过PartnerClaimType属性:

<OutputClaims>
    <OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="oid"/>
    <OutputClaim ClaimTypeReferenceId="tenantId" PartnerClaimType="tid"/>
    <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" />
    <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" />
    <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
    <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="contosoAuthentication" />
    <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="AzureADContoso" />
</OutputClaims>

实际上,我们正在寻找的 ID 甚至可能被映射到一个oid属性oid

那么 - 我们如何将用户Object ID从工作 AD 目录映射到所创建的新 B2C 身份的属性上?

4

1 回答 1

3

创建于 17 年 11 月 28 日

目前,Azure AD 用户(或任何外部用户)的对象标识符保存在 Azure AD B2C 目录中的“alternativeSecurityId”属性中,但无法通过 Azure AD Graph API 查询此内置属性。

但是,您可以创建自定义属性并将 Azure AD 身份提供程序中的“oid”声明映射到与此自定义属性关联的自定义声明。

Azure Active Directory B2C:在自定义配置文件编辑策略中创建和使用自定义属性中描述了创建自定义属性并将其用作自定义声明。

对于您的特定情况,您应该:

1:<ClaimType />在基本策略中添加一个,声明自定义声明:

<ClaimType Id="extension_AzureADUserObjectId">
  <DisplayName>Azure AD User Object ID</DisplayName>
  <DataType>string</DataType>
</ClaimType>

2:映射“SignInWithContoso”技术配置文件中的“oid”声明:

<OutputClaims>
  ...
  <OutputClaim ClaimTypeReferenceId="extension_AzureADUserObjectId" PartnerClaimType="oid" />
</OutputClaims>

3:将扩展应用程序的应用程序和对象标识符添加到“AAD-Common”技术配置文件,这是读取和写入 Azure AD B2C 目录的自定义声明所需的:

<TechnicalProfile Id="AAD-Common">
  <DisplayName>Azure Active Directory</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.AzureActiveDirectoryProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ApplicationObjectId">Insert the object identifier for the b2c-extensions-app application here</Item>
    <Item Key="ClientId">Insert the application identifier for the b2c-extensions-app application here</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="issuer_secret" StorageReferenceId="TokenSigningKeyContainer" />
  </CryptographicKeys>
  ...
</TechnicalProfile>

4:在“AAD-UserWriteUsingAlternativeSecurityId”技术配置文件中写入自定义声明:

<PersistedClaims>
  ...
  <PersistedClaim ClaimTypeReferenceId="extension_AzureADUserObjectId" />
</PersistedClaims>

5:阅读“AAD-UserReadUsingAlternativeSecurityId”技术简介中的自定义声明:

<OutputClaims>
  ...
  <OutputClaim ClaimTypeReferenceId="extension_AzureADUserObjectId" />
</OutputClaims>

6:在任何依赖方策略中发出自定义声明或通过 Azure AD Graph API 查询它。

更新于 18 年 2 月 15 日

2018 年 2 月 5 日发布此公告以来,外部颁发者(即 Azure AD 租户)和外部用户标识符(即 Azure AD 用户的对象标识符)可以从用户对象的“userIdentities”属性中读取Azure AD B2C 目录,其中“issuerUserId”属性包含外部用户标识符的 Base64 编码:

{
    "userIdentities": [
        {
            "issuer": "contoso.com",
            "issuerUserId": "Mjk2NzdlNTAtY2MwZS00MmU5LWJhNWMtZjFmMDdkZTUwMDhm"
        }
    ]
}
于 2017-11-28T01:31:22.383 回答