使用ClaimsTransformation在B2C生成额外odata.type属性问题排查
为什么B2C数据库会生成带@odata.type的额外属性?
这个问题其实挺常见的,先给你吃个定心丸:你并没有操作错误,这个额外属性是Azure AD B2C处理强类型声明时的默认行为。
原因解析
当你使用GetCurrentDateTime这类返回特定数据类型的ClaimsTransformation方法,并且把结果写入一个扩展属性时,B2C会自动添加[属性名]@odata.type这个字段,用来明确声明的数据类型(这里是Edm.DateTime)。这么做是为了确保后续通过Graph API读取或者其他流程处理这个属性时,系统能准确识别它的类型,避免类型解析错误。
两种处理方式
如果你不想保留这个额外属性,可以试试下面两种方案:
1. 将DateTime转换为字符串存储
修改你的ClaimsTransformation流程,先把获取到的当前时间转成字符串格式,再写入扩展属性。这样B2C就不会添加类型标识属性了。
首先添加一个转换字符串的ClaimsTransformation:
<ClaimsTransformation Id="ConvertConsentDateTimeToString" TransformationMethod="ConvertDateTimeToString"> <InputClaims> <InputClaim ClaimTypeReferenceId="tempCurrentDateTime" TransformationClaimType="inputDateTime" /> </InputClaims> <InputParameters> <InputParameter Id="dateTimeFormat" DataType="string" Value="yyyy-MM-ddTHH:mm:ss.fffffffZ" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="extension_TOUAcceptedDateTime" TransformationClaimType="outputString" /> </OutputClaims> </ClaimsTransformation>
然后调整你的流程,先获取时间,再转换:
<InputClaimsTransformations> <InputClaimsTransformation ReferenceId="GetConsentDateTime" /> <InputClaimsTransformation ReferenceId="ConvertConsentDateTimeToString" /> </InputClaimsTransformations> <!-- 对应的GetConsentDateTime修改为输出到临时声明 --> <ClaimsTransformation Id="GetConsentDateTime" TransformationMethod="GetCurrentDateTime"> <OutputClaims> <OutputClaim ClaimTypeReferenceId="tempCurrentDateTime" TransformationClaimType="currentDateTime" /> </OutputClaims> </ClaimsTransformation>
同时记得把extension_TOUAcceptedDateTime的ClaimType定义改成string类型:
<ClaimType Id="extension_TOUAcceptedDateTime"> <DisplayName>TOU Accepted DateTime</DisplayName> <DataType>string</DataType> </ClaimType>
2. 接受该属性的存在
其实这个@odata.type属性完全不会影响用户数据的正常使用——它只是B2C用来辅助类型解析的元数据。当你在应用程序中读取用户数据时,只需要过滤掉带有@odata.type后缀的键就可以了,核心的日期值extension_0428f3354957491e96bb7ce51b81d46a_TOUAcceptedDateTime依然是可用的。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

