Azure AD B2C API连接器ISO-8601字符串转DateTime报错问题
问题解决:Azure AD B2C自动将ISO-8601字符串声明转为DateTime导致类型冲突
问题本质
Azure AD B2C内置了声明类型自动解析逻辑:当REST API返回的字符串符合ISO-8601日期时间格式时,会自动将其识别为DateTime类型,哪怕你在策略的ClaimType中明确将该声明定义为String类型,这就会触发AADB2C99072类型不匹配错误——因为自定义用户属性仅支持String/Int/Boolean,无法存储DateTime类型值。这不是Bug,是B2C为兼容多场景设计的默认行为。
解决方法:规避自动解析
通过对API返回的日期字符串做微小修改,绕过B2C的自动DateTime识别,再在策略中还原原始字符串:
步骤1:修改REST API响应
在返回的ISO-8601字符串末尾添加一个非日期格式的后缀(比如_str),让B2C无法将其识别为DateTime:
{ "version": "1.0.0", "action": "continue", "extension_<ApplicationID>_LastLoginDate": "2023-09-29T12:04:26.7639519Z_str" }
步骤2:在B2C策略中添加声明转换
添加一个ReplaceClaimValue类型的ClaimsTransformation,用来去掉后缀,还原原始ISO字符串:
<ClaimsTransformation Id="StripLastLoginDateSuffix" TransformationMethod="ReplaceClaimValue"> <InputClaims> <InputClaim ClaimTypeReferenceId="extension_LastLoginDate" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="oldValue" DataType="string" Value="_str" /> <InputParameter Id="newValue" DataType="string" Value="" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="extension_LastLoginDate" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
步骤3:关联转换到REST技术配置
在调用该API的TechnicalProfile中,添加输出声明转换,确保拿到返回值后立即执行后缀剥离:
<TechnicalProfile Id="REST-UpdateLastLogin"> <!-- 原有配置(如Metadata、InputClaims等) --> <OutputClaims> <OutputClaim ClaimTypeReferenceId="extension_LastLoginDate" PartnerClaimType="extension_<ApplicationID>_LastLoginDate" /> </OutputClaims> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="StripLastLoginDateSuffix" /> </OutputClaimsTransformations> </TechnicalProfile>
补充说明
如果无法修改REST API的返回内容,另一种思路是先将API返回的声明映射到一个临时的String类型声明(确保该声明的ClaimType未被B2C自动解析),再通过ClaimsTransformation将其复制到目标用户属性声明中,但这种方法可靠性低于前者,因为B2C可能在初始解析时就已触发类型错误。
内容的提问来源于stack exchange,提问作者phuzi
相关产品推荐
相关产品推荐

