B2C自定义策略中StringReplace输入转换缺失redirectUri声明错误排查
问题场景
编写的声明转换代码如下:
<ClaimsTransformation Id="FormatRedirectUri" TransformationMethod="StringReplace"> <InputClaims> <InputClaim ClaimTypeReferenceId="redirectUri" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="oldValue" DataType="string" Value="/" /> <InputParameter Id="newValue" DataType="string" Value="\" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="updatedRedirectUri" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
并将其作为输入转换应用到技术配置文件P1:
<TechnicalProfile Id="P1"> <DisplayName>---</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">---</Item> <Item Key="AuthenticationType">Bearer</Item> <Item Key="UseClaimAsBearerToken">bearerToken</Item> <Item Key="SendClaimsIn">Body</Item> <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item> </Metadata> <InputClaimsTransformations> <InputClaimsTransformation ReferenceId="FormatRedirectUri"/> </InputClaimsTransformations> <InputClaims> <InputClaim ClaimTypeReferenceId="redirectUri" DefaultValue="{OIDC:RedirectUri}" AlwaysUseDefaultValue="true"/> </InputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
运行时收到报错:
A Claim of ClaimType with id "redirectUri" was not found, which is required by the ClaimsTransformationImpl of Type "Microsoft.Cpim.Data.Transformations.StringReplaceTransformation" for TransformationMethod "StringReplace" referenced by the ClaimsTransformation with id "FormatRedirectUri" in policy
错误原因
技术配置文件中InputClaimsTransformations的执行优先级高于InputClaims。
当执行P1技术配置文件时,系统会先触发InputClaimsTransformations里的FormatRedirectUri声明转换,但此时redirectUri声明还未生成——InputClaims中通过{OIDC:RedirectUri}解析声明的操作是在输入声明转换之后才执行的。声明转换找不到所需的redirectUri声明,因此抛出该错误。
解决方法
方案一:直接在声明转换中引用Claims Resolver
修改声明转换,通过InputParameter直接引用{OIDC:RedirectUri},无需依赖预先存在的redirectUri声明:
<ClaimsTransformation Id="FormatRedirectUri" TransformationMethod="StringReplace"> <InputParameters> <InputParameter Id="inputClaim" DataType="string" Value="{OIDC:RedirectUri}" /> <InputParameter Id="oldValue" DataType="string" Value="/" /> <InputParameter Id="newValue" DataType="string" Value="\" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="updatedRedirectUri" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
若后续不需要原始的redirectUri声明,可移除P1中InputClaims里的对应配置。
方案二:提前生成redirectUri声明
在用户旅程中调用P1技术配置文件之前,先执行一个专门用于解析redirectUri的技术配置文件,确保redirectUri已经存在于声明包中,再执行P1的声明转换操作。
内容的提问来源于stack exchange,提问作者Leo2304

