Azure B2C如何通过自定义策略限制未获管理员审批的用户登录
Azure AD B2C 自定义策略实现用户审批拦截及问题解决
一、基于自定义isApproved声明拦截未审批用户登录的实现步骤
- 首先在策略的
ClaimsSchema节点中声明与注册流程一致的自定义声明,注意B2C存储的扩展属性默认带有extension_前缀,示例配置如下:
- 首先在策略的
<ClaimType Id="extension_isApproved"> <DisplayName>Is Account Approved</DisplayName> <DataType>boolean</DataType> <AdminHelpText>Marks whether the user account has passed administrator review</AdminHelpText> </ClaimType>
- 在登录流程的用户读取技术配置文件(通常为
AAD-UserReadUsingObjectId)中添加输出声明,读取用户的extension_isApproved属性:
- 在登录流程的用户读取技术配置文件(通常为
<OutputClaim ClaimTypeReferenceId="extension_isApproved" />
- 新增声明转换规则,校验
extension_isApproved的值是否为true:
- 新增声明转换规则,校验
<ClaimsTransformation Id="AssertAccountApproved" TransformationMethod="AssertBooleanClaimIsEqualToValue"> <InputClaims> <InputClaim ClaimTypeReferenceId="extension_isApproved" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="valueToCompareTo" DataType="boolean" Value="true" /> </InputParameters> </ClaimsTransformation>
- 新增校验用技术配置文件,校验不通过时抛出指定的错误提示:
<TechnicalProfile Id="CheckAccountApproval"> <DisplayName>Account Approval Check</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="AssertAccountApproved" /> </OutputClaimsTransformations> <Metadata> <Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">your account is under review please try again once the account is approved</Item> </Metadata> </TechnicalProfile>
- 在用户旅程的登录流程中添加校验步骤,步骤顺序放在用户身份验证完成、用户属性读取完成之后,令牌颁发之前:
<OrchestrationStep Order="对应你的流程实际顺序" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="AccountApprovalCheckExchange" TechnicalProfileReferenceId="CheckAccountApproval" /> </ClaimsExchanges> </OrchestrationStep>
二、注册时设置accountEnabled为false返回账户锁定错误的解决方法
问题原因
默认注册流程在创建用户后会自动执行登录逻辑,此时你设置accountEnabled为false,系统会判定禁用账户尝试登录,直接抛出账户锁定的错误。
解决方案
- 如果需要保留
accountEnabled控制逻辑:修改注册用户旅程,拆分用户创建和自动登录环节,创建用户设置accountEnabled=false后,直接返回注册成功提示,不触发后续自动登录步骤。 - 如果需要注册后自动登录:放弃使用
accountEnabled实现审批拦截逻辑,改用上述自定义isApproved声明的方案即可。 - 如果需要保留自动登录且使用
accountEnabled:在注册流程的用户创建步骤后新增判断逻辑,若accountEnabled为false直接跳转至审批中提示页面,不进入后续登录鉴权环节。
内容的提问来源于stack exchange,提问作者Muhammad Magdy
相关产品推荐
相关产品推荐

