Azure B2C自定义策略无法解析PolicyId声明的配置问题
配置错误说明与解决方案
核心错误点
- 赋值时机不匹配:ValidationTechnicalProfile的前置条件(Preconditions)执行顺序,早于其所属父TechnicalProfile的OutputClaim赋值流程。你配置的PolicyId输出声明,是在父TP完成所有校验逻辑、执行到输出声明阶段才会被赋值,前置条件校验阶段该声明还未写入声明包,自然无法读取到
{Policy:PolicyId}解析后的值。硬编码DefaultValue能生效是因为静态硬编码值会在TP加载初始化阶段就写入声明包,和上下文解析器的动态解析、输出阶段赋值的时机完全不同。 - 冗余声明定义:Azure B2C自定义策略运行时内置了系统声明
trustFrameworkPolicy,默认就存储了当前用户请求实际生效的RP(信赖方)策略ID,不需要额外自定义声明、手动配置OutputClaim去捕获策略ID。 - 解析器场景误用:
{Policy:PolicyId}上下文解析器在OutputClaim节点中使用时,解析到的是当前TechnicalProfile所在策略文件的ID,不是最终用户访问的入口策略ID,在多策略分层继承(基类/扩展/RP三层结构)的场景下,拿到的值和你需要的「实际生效策略」需求不匹配。
正确配置方法
直接使用内置的trustFrameworkPolicy声明做前置条件判断即可,不需要额外配置PolicyId输出声明,示例如下:
<ValidationTechnicalProfile ReferenceId="SetActivity_BasedOnPolicyId_Yes" ContinueOnError="true"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="false"> <Value>trustFrameworkPolicy</Value> <Value>B2C_1A_SignIn</Value> <Action>SkipThisValidationTechnicalProfile</Action> </Precondition> </Preconditions> </ValidationTechnicalProfile>
提示:如果需要反向判断(当前策略不是B2C_1A_SignIn时执行校验),只需要把
ExecuteActionsIf的值改为true即可,逻辑和你原来的写法一致。
如果因特殊业务场景必须使用自定义的PolicyId声明,需要把该声明的赋值逻辑放到流程更早执行的节点(比如流程最开始的声明转换、用户读取类TechnicalProfile),保证ValidationTechnicalProfile的前置条件执行前,该声明已经写入声明包。这种方式额外增加了配置复杂度,非必要不使用。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

