azure B2C自定义策略中带字符串替换的输入转换

mf98qq94  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(116)

我有一个索赔转换如下:

<ClaimsTransformation Id="FormatRedirectUri" TransformationMethod="StringReplace">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="redirectUri" TransformationClaimType="inputClaim" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="oldValue" DataType="string" Value="/" />
    <InputParameter Id="newValue" DataType="string" Value="\" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="updatedRedirectUri" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>

现在,为了在另一个技术概要文件中使用这个声明转换作为输入转换,我这样使用它:

<TechnicalProfile Id="P1">
  <DisplayName>---</DisplayName>
  <Protocol
    Name="Proprietary"
    Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
  />
  <Metadata>
    <Item Key="ServiceUrl">---</Item>
    <Item Key="AuthenticationType">Bearer</Item>
    <Item Key="UseClaimAsBearerToken">bearerToken</Item>
    <Item Key="SendClaimsIn">Body</Item>
    <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item>
  </Metadata>
  <InputClaimsTransformations>
    <InputClaimsTransformation ReferenceId="FormatRedirectUri"/>
  </InputClaimsTransformations>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="redirectUri"  DefaultValue="{OIDC:RedirectUri}" AlwaysUseDefaultValue="true"/>
  </InputClaims>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

我正在使用OpenIdConnect协议中的声明解析器,该协议位于用户jouerney中的P1技术配置文件之上。但由于某种原因,我从b2c得到一个错误,
找不到ID为“redirectUri”的ClaimType的声明,这是策略中ID为“Microsoft.Cpim.Data.Transformations.StringReplaceTransformation”的ClaimsTransformationImpl所需的,用于策略中ID为“RedirectUri”的ClaimsTransformation引用的TransformationMethod“StringReplace”
知道为什么吗

bjg7j2ky

bjg7j2ky1#

您的声明转换和技术配置文件都引用了一个名为redirectUri的声明,该错误表明您没有在自定义策略中定义具有该名称的ClaimType
举例来说:

<BuildingBlocks>
  <ClaimsSchema>

    <!-- Other claim types -->

    <ClaimType Id="redirectUri">
      <DisplayName>Redirect URI</DisplayName>
      <DataType>string</DataType>
    </ClaimType>

  </ClaimsSchema>
</BuildingBlocks>

在任何地方都可以使用它之前,您必须使用define a claim,即使它只在自定义策略内部使用以传递数据。
我也不确定技术侧写是否会如你所愿。
我认为您希望它用传入请求的redirect_uri填充redirectUri,然后用\替换/字符,然后将修改后的redirectUri传递给您的API?
由于order in which a technical profile executes,我认为转换将首先替换redirectUri中的字符,* 然后 * 将其设置为传入请求的redirect_uri
你可能需要做的是有一个claims transformation technical profile,它将redirectUri设置为OutputClaim,并将索赔转换作为OutputClaimsTransformation运行:

<TechnicalProfile Id="PopulateRedirectUri">
  <DisplayName>Normalise Redirect URI</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item>
  </Metadata>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="redirectUri" DefaultValue="{OIDC:RedirectUri}" AlwaysUseDefaultValue="true" />
  </OutputClaims>
  <OutputClaimsTransformations>
    <OutputClaimsTransformation ReferenceId="FormatRedirectUri" />
  </OutputClaimsTransformations>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

然后,您可以在调用API之前将其作为一个编排步骤执行:

<UserJourneys>
  <UserJourney Id="YourJourneyNameHere">
    <OrchestrationSteps>
    
      <!-- Other journey steps -->

      <!-- these order numbers will be different in your policy -->
      <OrchestrationStep Order="4" Type="ClaimsExchange" >
        <ClaimsExchanges>
          <ClaimsExchange Id="Step-PopulateRedirectUri" TechnicalProfileReferenceId="PopulateRedirectUri" />
        </ClaimsExchanges>
      </OrchestrationStep>
      <OrchestrationStep Order="5" Type="ClaimsExchange" >
        <ClaimsExchanges>
          <ClaimsExchange Id="Step-P1" TechnicalProfileReferenceId="P1" />
        </ClaimsExchanges>
      </OrchestrationStep>
      
      <!-- Other journey steps -->
    </OrchestrationSteps>
  </UserJourney>
</UserJourney>

这应该能让事情按正确的顺序进行。
要做到这一点,您还需要确保您的API技术配置文件使用转换后的声明类型(updatedRedirectUri):

<TechnicalProfile Id="P1">
  <DisplayName>---</DisplayName>
  <Protocol
    Name="Proprietary"
    Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
  />
  <Metadata>
    <Item Key="ServiceUrl">---</Item>
    <Item Key="AuthenticationType">Bearer</Item>
    <Item Key="UseClaimAsBearerToken">bearerToken</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <InputClaims>
    <!-- value will be taken from updatedRedirectUri but passed to the API as redirectUri -->
    <InputClaim ClaimTypeReferenceId="updatedRedirectUri" PartnerClaimType="redirectUri" />
  </InputClaims>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

相关问题