Jwt 将REST API响应作为输出声明返回Azure B2C

Jwt 将REST API响应作为输出声明返回Azure B2C,jwt,azure-active-directory,azure-functions,azure-ad-b2c,azure-ad-graph-api,Jwt,Azure Active Directory,Azure Functions,Azure Ad B2c,Azure Ad Graph Api,大家好,谢谢你们的支持 我目前正在开发一个在JWT令牌中添加自定义声明的解决方案 设置如下所示: Azure B2C有一个针对多个索赔提供商的自定义策略 Azure AD的声明提供程序配置了标准声明和我的自定义声明 用于调用RESTAPI的声明提供程序 REST API gathers配置为从Graph API收集自定义属性,配置为使用“电子邮件”输入声明查找与用户登录相关的数据,以及使用“我的自定义声明”名称的“输出”声明 在用户SignUpSignIn旅程中添加了一个步骤,在发出JWT令牌之

大家好,谢谢你们的支持

我目前正在开发一个在JWT令牌中添加自定义声明的解决方案

设置如下所示:

  • Azure B2C有一个针对多个索赔提供商的自定义策略
  • Azure AD的声明提供程序配置了标准声明和我的自定义声明
  • 用于调用RESTAPI的声明提供程序
  • REST API gathers配置为从Graph API收集自定义属性,配置为使用“电子邮件”输入声明查找与用户登录相关的数据,以及使用“我的自定义声明”名称的“输出”声明
  • 在用户SignUpSignIn旅程中添加了一个步骤,在发出JWT令牌之前调用restapi
  • 用户旅程成功运行,我可以重定向到Azure AD进行身份验证,我可以看到从Azure中的日志触发REST API,并且我获得了我的JWT令牌。但我看不出有任何索赔

    当我检查RESTAPI日志时,我可以看到函数成功运行,如果我在Azure函数中手动运行测试选项,我还可以看到成功的响应,这是一个JSON数据数组。因此,这意味着我的RESTAPI应该如何工作。我还成功地从PowerShell和Web浏览器中测试了它,并在正文中获得了正确的响应

    我怀疑问题在于返回值并将其插入自定义声明的过程中,以便它出现在我的JWT令牌中

    仅供参考:我正在处理的自定义声明是返回用户在AzureAD中所属的安全组

            <ClaimsProvider>
            <DisplayName>REST API</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="GetUserGroups">
              <DisplayName>Retrieves security groups assigned to the user</DisplayName>
              <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
              <Metadata>
                <Item Key="ServiceUrl">https://contoso.azurewebsites.net/api/aadgroups?code=123456789QWERTYUIOP123456789QWERTYUIOP==</Item>
                <Item Key="AuthenticationType">None</Item>
                <Item Key="SendClaimsIn">Body</Item>
                <Item Key="AllowInsecureAuthInProduction">true</Item>
              </Metadata>
              <InputClaims>
                <InputClaim ClaimTypeReferenceId="email" />
              </InputClaims>
              <OutputClaims>
                <OutputClaim ClaimTypeReferenceId="restapigroups" />
              </OutputClaims>
              <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
            </TechnicalProfile>
            </TechnicalProfiles>
            </ClaimsProvider>
    
    
            <ClaimType Id="restapigroups">
              <DisplayName>Group memberships</DisplayName>
              <DataType>stringCollection</DataType>
              <UserHelpText>This is read only for the user</UserHelpText>
              <UserInputType>Readonly</UserInputType>
            </ClaimType>
    
    
            <OrchestrationStep Order="11" Type="ClaimsExchange">
              <ClaimsExchanges>
                <ClaimsExchange Id="AADUserGroups" TechnicalProfileReferenceId="GetUserGroups" />
              </ClaimsExchanges>
            </OrchestrationStep>
    
    
    RESTAPI
    检索分配给用户的安全组
    https://contoso.azurewebsites.net/api/aadgroups?code=123456789QWERTYUIOP123456789QWERTYUIOP==
    没有一个
    身体
    真的
    团体成员资格
    stringCollection
    这对于用户是只读的
    只读
    

    一如既往,我们非常感谢您的帮助,如果您有任何问题或建议,请告诉我。谢谢。

    您必须配置RelyingParty部分以将声明输出到令牌中。请参见此示例:

    您必须配置RelyingParty部分以将声明输出到令牌中。请参见此示例:

    另一件要提及的事情是,我曾尝试遵循下面详述的索赔转换方法,但这并不成功,可能不适用:另一件要提及的事情是,我曾尝试遵循下面详述的索赔转换方法,但这并不成功,也可能不适用:你是说Azure广告索赔提供商的相关方吗?输出声明添加到REST API和Azure AD声明提供程序部分(“RestapiGroup”)``在signinoSignup.xml中,您将有一个开始的部分。这将配置您的B2C索赔包中的哪些索赔被发放到B2C令牌中。您必须在那里添加输出声明。您所描述的是,您只将声明输出到claimbag,这是不够的。我现在明白您的意思了。我忘了提到声明已经正确地添加到了SignUpOrSignIn.xml中。我刚刚设法解决了这个问题,问题是我需要向JSON响应中输出的声明添加一个引用声明类型。一旦我这样做了,声明就正确地输出了。(PartnerClaimType=“xxxxx”)感谢您的支持和帮助,我们已经修复了它。好的,听起来您的API到B2C索赔映射不正确,因此B2C从未在索赔包中包含索赔。很高兴它解决了。你是说Azure广告索赔提供商的相关方吗?输出声明添加到REST API和Azure AD声明提供程序部分(“RestapiGroup”)``在signinoSignup.xml中,您将有一个开始的部分。这将配置您的B2C索赔包中的哪些索赔被发放到B2C令牌中。您必须在那里添加输出声明。您所描述的是,您只将声明输出到claimbag,这是不够的。我现在明白您的意思了。我忘了提到声明已经正确地添加到了SignUpOrSignIn.xml中。我刚刚设法解决了这个问题,问题是我需要向JSON响应中输出的声明添加一个引用声明类型。一旦我这样做了,声明就正确地输出了。(PartnerClaimType=“xxxxx”)感谢您的支持和帮助,我们已经修复了它。好的,听起来您的API到B2C索赔映射不正确,因此B2C从未在索赔包中包含索赔。很高兴它解决了。