Azure Active Directory B2C 自定义邀请策略 - 在步骤之间传递自定义声明

use*_*730 4 azure azure-active-directory azure-ad-b2c identity-experience-framework

我已通过此示例实施了邀请策略(通过向用户发送电子邮件链接来邀请用户访问该站点)https://github.com/azure-ad-b2c/samples/tree/master/policies/invite

我有这个用户旅程

<UserJourney Id="SignUpInvitation">
      <OrchestrationSteps>

        <OrchestrationStep Order="1" Type="GetClaims" CpimIssuerTechnicalProfileReferenceId="IdTokenHint_ExtractClaims" />

        <OrchestrationStep Order="2" Type="ClaimsExchange">
         <Preconditions>
            <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
              <Value>email</Value>
              <Action>SkipThisOrchestrationStep</Action>
            </Precondition>
          </Preconditions>        
          <ClaimsExchanges>
            <ClaimsExchange Id="SelfAsserted-Unsolicited" TechnicalProfileReferenceId="SelfAsserted-Unsolicited"/>
          </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="3" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="LocalAccountSignUpWithReadOnlyEmail" TechnicalProfileReferenceId="LocalAccountSignUpWithReadOnlyEmail"/>
          </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="4" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
          </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="5" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer"/>

      </OrchestrationSteps>
      <ClientDefinition ReferenceId="DefaultWeb"/>
    </UserJourney>
Run Code Online (Sandbox Code Playgroud)

在第一步中,我从 JWT 中提取声明。一封电子邮件和一份自定义声明,

<TechnicalProfiles>
        <TechnicalProfile Id="IdTokenHint_ExtractClaims">
          <DisplayName> My ID Token Hint TechnicalProfile</DisplayName>
          <Protocol Name="None" />
          <Metadata>

            <Item Key="METADATA">https://mywebsite.com/internal/v1/invitation/.well-known/openid-configuration</Item>

          </Metadata>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="email" />  
            <OutputClaim ClaimTypeReferenceId="extension_DBId" DefaultValue="1" />
          </OutputClaims>

        </TechnicalProfile>
      </TechnicalProfiles>
Run Code Online (Sandbox Code Playgroud)

(请注意,我1为自定义声明设置了默认值)

然后,我有将用户写入目录的技术配置文件

<TechnicalProfile Id="LocalAccountSignUpWithReadOnlyEmail">
          <DisplayName>Email signup</DisplayName>
          <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <Metadata>
            <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
            <Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
            <Item Key="language.button_continue">Create</Item>
            <!-- Sample: Remove sign-up email verification -->
            <Item Key="EnforceEmailVerification">False</Item>
          </Metadata>
          <InputClaimsTransformations>
            <InputClaimsTransformation ReferenceId="CopyEmailAddress" />
          </InputClaimsTransformations>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="ReadOnlyEmail" />
            <InputClaim ClaimTypeReferenceId="extension_DBId" DefaultValue="2" />
          </InputClaims>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="objectId" />
            <OutputClaim ClaimTypeReferenceId="ReadOnlyEmail" Required="true" />
            <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
            <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
            <OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" />
            <OutputClaim ClaimTypeReferenceId="newUser" />
          </OutputClaims>
          <ValidationTechnicalProfiles>
          <ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail-Custom" />

          </ValidationTechnicalProfiles>
           <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> 
        </TechnicalProfile>  
Run Code Online (Sandbox Code Playgroud)

(请注意,这里我2为我的自定义声明设置了默认值)

AAD-UserWriteUsingLogonEmail-Custom是对内置(内部TrustFrameworkBase.xmlAAD-UserWriteUsingLogonEmail配置文件的修改,我对其进行了修改,将我的自定义声明extension_DBId作为持久声明包含在内:

<PersistedClaim ClaimTypeReferenceId="extension_DBId" DefaultValue="3" />
Run Code Online (Sandbox Code Playgroud)

问题来了,

我生成了一个带有一些任意extension_DBId(不是 1,2 或 3)的 JWT
但是当我用它运行策略时,在输出声明中,我得到extension_DBId=2

这表明第三个编排步骤 ( LocalAccountSignUpWithReadOnlyEmail) 没有收到extension_DBId来自第一个编排步骤 ( IdTokenHint_ExtractClaims) 的声明。

为什么IdTokenHint_ExtractClaims配置文件不将声明转移extension_DBIdLocalAccountSignUpWithReadOnlyEmail配置文件?

我试图删除第二步(SelfAsserted-Unsolicited),仍然没有奏效。

会是什么呢?

Chr*_*ett 5

对于从输入 JWT 接收传入声明的用户旅程,您必须<InputClaim />向依赖方添加一个<TechnicalProfile />

<RelyingParty>
  <TechnicalProfile Id="PolicyProfile">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="email" />
      <InputClaim ClaimTypeReferenceId="extension_DBId" />
    </InputClaims>
  </TechnicalProfile>
</RelyingParty>
Run Code Online (Sandbox Code Playgroud)

如果内部声明(例如extension_DBId)的声明类型与输入 JWT(例如DBId)的声明类型不同,那么您可以将PartnerClaimType属性添加到InputClaim元素:

<InputClaim ClaimTypeReferenceId="extension_DBId" PartnerClaimType="DBId" />
Run Code Online (Sandbox Code Playgroud)