You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure B2C自定义策略:检查用户所有组并条件触发MFA

Azure B2C自定义策略:通过Graph API获取用户组并条件启用MFA

问题概述

在Azure B2C自定义策略中,通过Microsoft Graph API获取用户所属组(数量可为0或多个),Graph返回包含组ID的对象数组。需要检查特定组ID是否存在,以此在颁发令牌前条件性启用MFA。目前只能通过显式检查数组索引实现,无法遍历所有组,怀疑groups集合未正确填充,不确定是否可通过value[*].id将所有ID转换为字符串集合。

当前配置代码

<TechnicalProfile Id="Graph-GetUserGroups">
  <DisplayName>Get user's group memberships using Graph API</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://graph.microsoft.com/v1.0/users/{objectId}/memberOf?$select=id</Item>
    <Item Key="SendClaimsIn">Url</Item>
    <Item Key="AuthenticationType">Bearer</Item>
    <Item Key="UseClaimAsBearerToken">accessToken</Item>
    <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item>
    <Item Key="ClaimResolverUrlFormatting">true</Item>
    <Item Key="ResolveJsonPathsInJsonTokens">true</Item>
  </Metadata>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="objectId" />
    <InputClaim ClaimTypeReferenceId="accessToken" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="groups" PartnerClaimType="value[*].id" />
  </OutputClaims>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

<ClaimType Id="groups">
  <DisplayName>Groups</DisplayName>
  <DataType>stringCollection</DataType>
  <DefaultPartnerClaimTypes>
    <Protocol Name="OAuth2" PartnerClaimType="groups" />
  </DefaultPartnerClaimTypes>
  <UserHelpText>The groups that the user is a member of.</UserHelpText>
</ClaimType>

<ClaimType Id="enforceMfa">
  <DisplayName>Enforce MFA for this user</DisplayName>
  <DataType>boolean</DataType>
</ClaimType>

<ClaimsTransformation Id="CheckIfUserInMfaGroup" TransformationMethod="StringCollectionContains">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="groups" TransformationClaimType="inputClaim" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="item" DataType="string" Value="<group id>" />
    <InputParameter Id="ignoreCase" DataType="string" Value="false"/>
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="enforceMfa" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>

解决方法

你的思路是对的,value[*].id确实可以提取Graph返回数组中所有对象的id字段,并映射到stringCollection类型的groups声明中。问题大概率出在以下环节,可按步骤排查修复:

  • 确认Graph API权限:确保调用Graph API的应用已授予GroupMember.Read.All或Directory.Read.All的应用权限(委托权限不适用自定义策略后台调用),并完成管理员同意。
  • 验证JSON路径解析配置:已设置ResolveJsonPathsInJsonTokens="true",这个元数据是启用JSON路径解析的关键,确认无拼写错误。
  • 调整声明映射方式:若直接映射不生效,可先存储原始组数组,再通过声明转换提取ID:
    <!-- 新增临时声明存储原始组对象数组 -->
    <ClaimType Id="rawGroups">
      <DisplayName>Raw Group Objects</DisplayName>
      <DataType>json</DataType>
    </ClaimType>
    
    <!-- 修改Graph-GetUserGroups的输出声明 -->
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="rawGroups" PartnerClaimType="value" />
    </OutputClaims>
    
    <!-- 新增声明转换提取所有组ID到stringCollection -->
    <ClaimsTransformation Id="ExtractGroupIds" TransformationMethod="JsonExtractArray">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="rawGroups" TransformationClaimType="inputJson" />
      </InputClaims>
      <InputParameters>
        <InputParameter Id="jsonPath" DataType="string" Value="$[*].id" />
      </InputParameters>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="groups" TransformationClaimType="outputClaim" />
      </OutputClaims>
    </ClaimsTransformation>
    
    在用户旅程中先调用Graph-GetUserGroups,再执行ExtractGroupIds转换,确保groups集合被正确填充。
  • 验证转换执行时机:确保CheckIfUserInMfaGroup转换在Graph-GetUserGroups执行之后调用,且groups声明已进入当前策略上下文。
  • 调试确认声明值:使用Azure B2C策略调试工具,查看Graph-GetUserGroups执行后groups声明的实际值,确认是否包含所有组ID。

内容的提问来源于stack exchange,提问作者ms18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:25:54