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
相关产品推荐
相关产品推荐

