是否可以使用身份体验框架使用发行人的声明自动更新 B2C 用户详细信息?
Is it possible to automatically update B2C user details by using claims from the Issuer, using Identity Experience Framework?
我已经为 B2C tutorial docs 之后的应用程序创建了一个策略。
它成功地在 B2C 租户中创建用户,填写来自 any/all 发行人的 givename.. 电子邮件等 - 目前,其他任何其他 Azure 租户都可以登录此 B2C 租户,这是必需的。
但是,如果原始发行人的对象的详细信息发生变化(例如名称更改)怎么办?目前会有不匹配,除非用户跟随旅程编辑他们自己的个人资料(手动)。
在 B2C 租户中存在对象后,是否可以创建一个请求发行者声明的旅程,然后用新的详细信息更新本地用户?
我希望实现的结果是自动更新 B2C 租户用户,如果原始帐户以某种方式进行了编辑,则在 B2C 用户进行身份验证时。这样,可以向链接到 B2C 租户的应用程序发送更新的声明。
我理解前提,但我缺乏的是我需要在旅程中采取哪些步骤以及这些步骤是什么样子的知识。如果有人可以分享一个示例,即使只是从原始发行人那里读取一个名称,并将其复制到 B2C 租户用户,那对我来说将非常有用。
[编辑]感谢Jas的详细解答!
我通过简单地在注册-登录过程的结尾添加 AAD-UserReadUsingObjectId 和 AAD-UserWriteUsingAlternativeSecurityId 步骤来解决这个问题。每次登录时使用原始对象的声明更新 B2C 用户对象,并满足要求,因为它更新 B2C 租户并将更新的属性传递给也需要它们的应用程序。
流程为:
- 用户登录
- 通过API致电原发行人,获取用户最新详情
- 比较详细信息并根据需要进行更新。您可以使用 string transformations.
- 写下更新的详细信息
OpenId technical profile 中的输出声明允许您将从 IdP 传入的声明映射到 AAD B2C 声明包中。
让我们使用监控 displayName 是否在 IdP 发生变化的例子。
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="live.com" />
<OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
<OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="sub" />
<OutputClaim ClaimTypeReferenceId="displayNameFromIdp" PartnerClaimType="name" />
<OutputClaim ClaimTypeReferenceId="email" />
</OutputClaims>
然后我们默认使用AAD-ReadUsingAlternativeSecurityId读取用户。请参阅此处的输出声明如下,这将读取 B2C 目录中已存在的用户的显示名称。
<OutputClaims>
<!-- Required claims -->
<OutputClaim ClaimTypeReferenceId="objectId" />
<!-- Optional claims -->
<OutputClaim ClaimTypeReferenceId="userPrincipalName" />
<OutputClaim ClaimTypeReferenceId="displayName" />
<OutputClaim ClaimTypeReferenceId="otherMails" />
<OutputClaim ClaimTypeReferenceId="givenName" />
<OutputClaim ClaimTypeReferenceId="surname" />
<OutputClaim ClaimTypeReferenceId="identityChanged" DefaultValue="false"/>
</OutputClaims>
现在,我们使用 CompareClaims claim transform 比较 displayName
和 displayNameFromIdp
值。
<ClaimsTransformation Id="CompareDisplayName" TransformationMethod="CompareClaims">
<InputClaims>
<InputClaim ClaimTypeReferenceId="displayNameFromIdp" TransformationClaimType="inputClaim1" />
<InputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="inputClaim2" />
</InputClaims>
<InputParameters>
<InputParameter Id="operator" DataType="string" Value="NOT EQUAL" />
<InputParameter Id="ignoreCase" DataType="boolean" Value="true" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="identityChanged" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
为您要检查的每个声明进行这样的声明转换。仅更改 inputClaims
,因此如果有任何更改,它始终反映为 identityChanged
声明中的布尔值。
将此 claimTransform 作为输出声明转换添加到 AAD-ReadUsingAlternativeSecurityId
:
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="CompareDisplayName" />
</OutputClaimsTransformations>
对于您创建的每个声明转换,对于您希望保持同步的每个属性,添加一个引用声明转换 ID 的输出声明转换。
现在,如果 identityChanged
== true
,我们知道调用 AAD 写入技术配置文件。在您的旅程中,在 AAD-UserReadUsingAlternativeSecurityId
之后(读取用户之后)和 AAD-UserWriteUsingAlternativeSecurityId
之后(创建用户之后)添加一个步骤。
<OrchestrationStep Order="NUMBER" Type="ClaimsExchange">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="true">
<Value>identityChanged</Value>
<Value>false</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
<ClaimsExchanges>
<ClaimsExchange Id="AADUserUpdate" TechnicalProfileReferenceId="AAD-UserUpdateUsingAlternativeSecurityId" />
</ClaimsExchanges>
</OrchestrationStep>
定义一个Azure AD technical profile来更新用户:
<TechnicalProfile Id="AAD-UserUpdateUsingAlternativeSecurityId">
<Metadata>
<Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">false</Item>
</Metadata>
<PersistedClaims>
<PersistedClaim ClaimTypeReferenceId="alternativeSecurityId" />
</PersistedClaims>
<IncludeTechnicalProfile ReferenceId="AAD-UserWriteUsingAlternativeSecurityId" />
<UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>
定义声明 identityChanged
,并且 displayNameFromIdp
:
<ClaimType Id="identityChanged">
<DisplayName>identityChanged</DisplayName>
<DataType>boolean</DataType>
</ClaimType>
<ClaimType Id="displayNameFromIdp">
<DisplayName>displayNameFromIdp</DisplayName>
<DataType>string</DataType>
</ClaimType>
我已经为 B2C tutorial docs 之后的应用程序创建了一个策略。 它成功地在 B2C 租户中创建用户,填写来自 any/all 发行人的 givename.. 电子邮件等 - 目前,其他任何其他 Azure 租户都可以登录此 B2C 租户,这是必需的。
但是,如果原始发行人的对象的详细信息发生变化(例如名称更改)怎么办?目前会有不匹配,除非用户跟随旅程编辑他们自己的个人资料(手动)。
在 B2C 租户中存在对象后,是否可以创建一个请求发行者声明的旅程,然后用新的详细信息更新本地用户?
我希望实现的结果是自动更新 B2C 租户用户,如果原始帐户以某种方式进行了编辑,则在 B2C 用户进行身份验证时。这样,可以向链接到 B2C 租户的应用程序发送更新的声明。
我理解前提,但我缺乏的是我需要在旅程中采取哪些步骤以及这些步骤是什么样子的知识。如果有人可以分享一个示例,即使只是从原始发行人那里读取一个名称,并将其复制到 B2C 租户用户,那对我来说将非常有用。
[编辑]感谢Jas的详细解答! 我通过简单地在注册-登录过程的结尾添加 AAD-UserReadUsingObjectId 和 AAD-UserWriteUsingAlternativeSecurityId 步骤来解决这个问题。每次登录时使用原始对象的声明更新 B2C 用户对象,并满足要求,因为它更新 B2C 租户并将更新的属性传递给也需要它们的应用程序。
流程为:
- 用户登录
- 通过API致电原发行人,获取用户最新详情
- 比较详细信息并根据需要进行更新。您可以使用 string transformations.
- 写下更新的详细信息
OpenId technical profile 中的输出声明允许您将从 IdP 传入的声明映射到 AAD B2C 声明包中。
让我们使用监控 displayName 是否在 IdP 发生变化的例子。
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="live.com" />
<OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
<OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="sub" />
<OutputClaim ClaimTypeReferenceId="displayNameFromIdp" PartnerClaimType="name" />
<OutputClaim ClaimTypeReferenceId="email" />
</OutputClaims>
然后我们默认使用AAD-ReadUsingAlternativeSecurityId读取用户。请参阅此处的输出声明如下,这将读取 B2C 目录中已存在的用户的显示名称。
<OutputClaims>
<!-- Required claims -->
<OutputClaim ClaimTypeReferenceId="objectId" />
<!-- Optional claims -->
<OutputClaim ClaimTypeReferenceId="userPrincipalName" />
<OutputClaim ClaimTypeReferenceId="displayName" />
<OutputClaim ClaimTypeReferenceId="otherMails" />
<OutputClaim ClaimTypeReferenceId="givenName" />
<OutputClaim ClaimTypeReferenceId="surname" />
<OutputClaim ClaimTypeReferenceId="identityChanged" DefaultValue="false"/>
</OutputClaims>
现在,我们使用 CompareClaims claim transform 比较 displayName
和 displayNameFromIdp
值。
<ClaimsTransformation Id="CompareDisplayName" TransformationMethod="CompareClaims">
<InputClaims>
<InputClaim ClaimTypeReferenceId="displayNameFromIdp" TransformationClaimType="inputClaim1" />
<InputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="inputClaim2" />
</InputClaims>
<InputParameters>
<InputParameter Id="operator" DataType="string" Value="NOT EQUAL" />
<InputParameter Id="ignoreCase" DataType="boolean" Value="true" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="identityChanged" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
为您要检查的每个声明进行这样的声明转换。仅更改 inputClaims
,因此如果有任何更改,它始终反映为 identityChanged
声明中的布尔值。
将此 claimTransform 作为输出声明转换添加到 AAD-ReadUsingAlternativeSecurityId
:
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="CompareDisplayName" />
</OutputClaimsTransformations>
对于您创建的每个声明转换,对于您希望保持同步的每个属性,添加一个引用声明转换 ID 的输出声明转换。
现在,如果 identityChanged
== true
,我们知道调用 AAD 写入技术配置文件。在您的旅程中,在 AAD-UserReadUsingAlternativeSecurityId
之后(读取用户之后)和 AAD-UserWriteUsingAlternativeSecurityId
之后(创建用户之后)添加一个步骤。
<OrchestrationStep Order="NUMBER" Type="ClaimsExchange">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="true">
<Value>identityChanged</Value>
<Value>false</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
<ClaimsExchanges>
<ClaimsExchange Id="AADUserUpdate" TechnicalProfileReferenceId="AAD-UserUpdateUsingAlternativeSecurityId" />
</ClaimsExchanges>
</OrchestrationStep>
定义一个Azure AD technical profile来更新用户:
<TechnicalProfile Id="AAD-UserUpdateUsingAlternativeSecurityId">
<Metadata>
<Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">false</Item>
</Metadata>
<PersistedClaims>
<PersistedClaim ClaimTypeReferenceId="alternativeSecurityId" />
</PersistedClaims>
<IncludeTechnicalProfile ReferenceId="AAD-UserWriteUsingAlternativeSecurityId" />
<UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>
定义声明 identityChanged
,并且 displayNameFromIdp
:
<ClaimType Id="identityChanged">
<DisplayName>identityChanged</DisplayName>
<DataType>boolean</DataType>
</ClaimType>
<ClaimType Id="displayNameFromIdp">
<DisplayName>displayNameFromIdp</DisplayName>
<DataType>string</DataType>
</ClaimType>