我使用 Microsoft 的此示例策略 作为使用电子邮件地址实施 2FA 的起点。 在示例策略中,他们在编排的第一步将 SignInName 值复制到 ReadOnlyClaim 声明中。
但是,我需要做的是使用 B2C 中的 Mail 字段,因此我试图弄清楚如何在编排早期将 Mail 字段复制到 ReadOnlyEmail 声明中,以便在执行基于电子邮件的 2FA。
编排的第 3 步是我们查询 AD 的其他字段。我能够在这一步中成功拉回 Mail 属性。
<OrchestrationStep Order="3" Type="ClaimsExchange">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="true">
<Value>authenticationSource</Value>
<Value>socialIdpAuthentication</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
<ClaimsExchanges>
<ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
</ClaimsExchanges>
</OrchestrationStep>
因此,我创建了第 4 步,将 Mail 属性复制到 ReadOnlyEmail 字段中。 然而,似乎这个值永远不会被设置,我不明白为什么。
<OrchestrationStep Order="4" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="AADCopyMailToReadOnlyEmail" TechnicalProfileReferenceId="TpCopyMailToReadOnlyEmail" />
</ClaimsExchanges>
</OrchestrationStep>
<TechnicalProfile Id="TpCopyMailToReadOnlyEmail">
<DisplayName>Copy the Mail attribute to the ReadOnlyEmail attribute.</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<InputClaims>
<InputClaim ClaimTypeReferenceId="mail" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="mail" />
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="CopyMailToReadOnlyEmail" />
</OutputClaimsTransformations>
</TechnicalProfile>
<ClaimsTransformation Id="CopyMailToReadOnlyEmail" TransformationMethod="FormatStringClaim">
<InputClaims>
<InputClaim ClaimTypeReferenceId="mail" TransformationClaimType="inputClaim" />
</InputClaims>
<InputParameters>
<InputParameter Id="stringFormat" DataType="string" Value="{0}" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="readOnlyEmail" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
但是每次执行 EmailVerifyOnSignIn 技术配置文件时,readOnlyEmail 声明都会继续包含 SignInName,而不是我尝试覆盖它的 Mail 属性。
如果在 TP 中执行 OutputClaimsTransformations,则还需要在 TP 中输出 OutputClaimsTransformations 值。
在TP中,添加:
<OutputClaim ClaimTypeReferenceId="readOnlyEmail" />