【问题标题】:Is there a way to conditionally copy claims in custom policies?有没有办法有条件地复制自定义政策中的声明?
【发布时间】:2021-08-05 15:26:58
【问题描述】:

我们希望在登录后将用户电子邮件作为声明之一返回。但是,根据用户登录的方式,甚至在他们刚刚注册之后,电子邮件的声明会有所不同。有没有办法将它们全部合并到一个 email 声明中?

我们当前的解决方法是在最后一步通过多次指定声明来合并它们。但是,在创建 SAML 策略时,这将创建多个声明并导致错误。我们想在更早的阶段合并。

    <TechnicalProfile Id="PolicyProfile">
      <DisplayName>PolicyProfile</DisplayName>
      <Protocol Name="OpenIdConnect" />
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="displayName" />
        <OutputClaim ClaimTypeReferenceId="givenName" />
        <OutputClaim ClaimTypeReferenceId="surname" />
        <OutputClaim ClaimTypeReferenceId="trustFrameworkPolicy" Required="true" DefaultValue="{policy}" />

        <!-- If the user used social sign in -->
        <OutputClaim ClaimTypeReferenceId="email" />
        <!-- Required when the user just signed up and still has the "sign up session" -->
        <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
        <!-- Get email from local account - must not set default value -->
        <OutputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email" />

        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" />
        <OutputClaim ClaimTypeReferenceId="identityProvider" />
      </OutputClaims>
      <SubjectNamingInfo ClaimType="sub" />
    </TechnicalProfile>

到目前为止我尝试了什么:

      <ClaimsTransformation Id="CopySignInNameToEmail" TransformationMethod="CopyClaim">
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="signInName" TransformationClaimType="inputClaim"/>
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="email" TransformationClaimType="outputClaim"/>
        </OutputClaims>
      </ClaimsTransformation>

但是,如果输入声明为空或尚不存在,这将失败。

【问题讨论】:

    标签: azure azure-active-directory identity-experience-framework


    【解决方案1】:

    • 您可以尝试使用以下“FormatStringMultipleClaims”类型的声明转换方法,方法是将输入声明作为多个属性,然后根据需要将输出声明合并到一个字符串中,如下所示:-

    <ClaimsTransformation Id="CreateEmailIDFromFirstNameDisplayNameLastName" 
     TransformationMethod="FormatStringMultipleClaims">
     <InputClaims>
     <InputClaim ClaimTypeReferenceId="givenName" 
      TransformationClaimType="inputClaim1" />
     <InputClaim ClaimTypeReferenceId="surName" 
       TransformationClaimType="inputClaim2" />
     </InputClaims>
     <InputParameters>
     <InputParameter Id="stringFormat" DataType="string" Value="{0} {1}" />
     </InputParameters>
     <OutputClaims>
     <OutputClaim ClaimTypeReferenceId="email" TransformationClaimType="outputClaim" 
       />
     </OutputClaims>
     </ClaimsTransformation>
    

    • 上述转换使用 C# String.Format 方法,其中输入声明充当字符串格式 {0} 和支持字符串声明转换表达式的 {1} 参数。

    • 请在以下链接中找到更多信息:-

    https://docs.microsoft.com/en-us/azure/active-directory-b2c/string-transformations

    https://docs.microsoft.com/en-us/azure/active-directory-b2c/claimstransformations

    【讨论】:

    • 谢谢,我会调查的。最好有一个真正的条件逻辑,但无论如何我都会尝试。
    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 2019-06-21
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2020-04-15
    相关资源
    最近更新 更多