在Azure AD B2C中限制应用程序声明

5
我们有三个不同的应用程序需要不同的扩展声明集。
应用程序A:声明A1,声明A2,声明A3 应用程序B:声明B1,声明B2,声明B3
我们在TrustFrameworkExtensions中定义了这6个声明,更新了各种TechnicalProfiles以从用户接收输入并将其写入目录。
为了支持各个应用程序的需求,我们创建了2个RP文件,每个应用程序一个,并定义了特定于应用程序的用户旅程。
这6个声明都出现在这两个应用程序中,并且我们想通过应用程序来限制声明。
尝试将TrustFrameworkExtensions中的所有内容复制到RP文件中,但是RP无法加载并抛出以下错误:
无法上传策略。原因: 在租户“XXXXXXXXX.onmicrosoft.com”的策略“B2C_1A_1182017SIGNUP_SIGNIN”中发现3个验证错误。 在策略“B2C_1A_1182017signup_signin”的id为“AAD-UserWriteUsingAlternativeSecurityId”的TechnicalProfile中未找到关键字为“ApplicationObjectId”的Metadata项。 在策略“B2C_1A_1182017signup_signin”的id为“AAD-UserWriteUsingLogonEmail”的TechnicalProfile中未找到关键字为“ApplicationObjectId”的Metadata项。 在策略“B2C_1A_1182017signup_signin”的id为“AAD-UserWriteProfileUsingObjectId”的TechnicalProfile中未找到关键字为“ApplicationObjectId”的Metadata项。
请提供建议和指导,以支持具有不同声明的多个应用程序。
2个回答

10
为了在您的自定义策略中使用扩展属性,您需要在文件中添加一些配置,涉及到b2c-extensions-app,在每个B2C租户的门户中自动创建和注册。
在您的情况下,您似乎缺少ApplicationObjectID和可能是ClientId b2c-extensions-app在AAD-Common技术配置文件的Metadata键部分。
创建自定义属性文档的下一步部分描述了如何执行此配置。

https://learn.microsoft.com/en-us/azure/active-directory-b2c/custom-policy-custom-attributes#modify-your-custom-policy

  1. 打开您策略的扩展文件。例如,SocialAndLocalAccounts/TrustFrameworkExtensions.xml。

  2. 找到ClaimsProviders元素。向ClaimsProviders元素添加一个新的ClaimsProvider。

  3. 将ApplicationObjectId替换为您之前记录的对象ID。然后在下面的代码片段中用之前记录的应用程序ID替换ClientId。

    <ClaimsProvider>
      <DisplayName>Azure Active Directory</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="AAD-Common">
          <Metadata>
            <!--Insert b2c-extensions-app application ID here, for example: 11111111-1111-1111-1111-111111111111-->  
            <Item Key="ClientId"></Item>
            <!--Insert b2c-extensions-app application ObjectId here, for example: 22222222-2222-2222-2222-222222222222-->
            <Item Key="ApplicationObjectId"></Item>
          </Metadata>
        </TechnicalProfile>
      </TechnicalProfiles> 
    </ClaimsProvider>

0
使用<RelyingParty><TechnicalProfile><OutputClaims>来控制返回的声明。
<RelyingParty>
    <DefaultUserJourney ReferenceId="SignInAppA" />
    <TechnicalProfile Id="PolicyProfile">
      <DisplayName>PolicyProfile</DisplayName>
      <Protocol Name="OpenIdConnect" />
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="ClaimA1" />
      </OutputClaims>
      <SubjectNamingInfo ClaimType="sub" />
    </TechnicalProfile>
</RelyingParty>

并且

<RelyingParty>
    <DefaultUserJourney ReferenceId="SignInAppB" />
    <TechnicalProfile Id="PolicyProfile">
      <DisplayName>PolicyProfile</DisplayName>
      <Protocol Name="OpenIdConnect" />
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="ClaimB1" />
      </OutputClaims>
      <SubjectNamingInfo ClaimType="sub" />
    </TechnicalProfile>
</RelyingParty>

1
谢谢您,spottedman。当我制作RP文件时,我确实将应用程序特定的声明放在了各个RP文件中,与建议类似。但仍然无法正常工作。我有2个声明和2个RP...一个RP带有两个声明,另一个RP只有一个声明。这些声明都会在本地账户注册时显示出来。 - Jay Paddy
嗯...在发布之前我测试过上面的代码,所以也许你没有调用你认为的 RP? - spottedmahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接