如何将 属性 从 Azure AD 登录映射到 B2C 身份?

How can I map a property from an Azure AD login to a B2C identity?

按照这个例子https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-setup-aad-custom,我们已经成功地将 Azure AD 目录 ('AD') 与 Azure AD B2C 目录 ('B2C') 联合起来,因此我们可以拥有社交和自我-asserted 注册 public 应用程序,我们的工作用户也可以使用他们的正常工作 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) - 但是当我们稍后查询用户的 B2C 图时,这个 oid 属性 未返回。

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

创建于 17 年 11 月 28 日

目前,Azure AD 用户(或任何外部用户)的对象标识符保存在 Azure AD B2C 目录中的 "alternativeSecurityId" 属性中,但无法通过以下方式查询此内置属性Azure AD 图 API.

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

Azure Active Directory B2C: Creating and using custom attributes in a custom profile edit policy 中描述了创建自定义属性并将其用作自定义声明。

针对您的具体情况,您应该:

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:将 the extensions app 的应用程序和对象标识符添加到 "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。

2018 年 2 月 15 日更新

因为 Azure AD B2C 目录中的用户对象 this announcement on 5 Feb 18, the external issuer (i.e., the Azure AD tenant) and the external user identifier (i.e., the object identifier of the Azure AD user) can be read from the "userIdentities" property,其中 "issuerUserId" 属性 包含外部用户标识符的 Base64 编码:

{
    "userIdentities": [
        {
            "issuer": "contoso.com",
            "issuerUserId": "Mjk2NzdlNTAtY2MwZS00MmU5LWJhNWMtZjFmMDdkZTUwMDhm"
        }
    ]
}