如何在Azure AD B2C自定义策略中读取state参数并传递给REST API
如何在Azure AD B2C自定义策略中读取state参数并传递给REST API
没问题,这个需求在Azure AD B2C自定义策略里完全可以实现,我来给你一步步拆解操作步骤:
1. 先在自定义策略中声明state作为ClaimType
首先,你需要在策略的<ClaimsSchema>节点下添加一个state声明类型,用来存储客户端传递的state参数值:
<ClaimsSchema> <ClaimType Id="state"> <DisplayName>State Parameter</DisplayName> <DataType>string</DataType> <UserHelpText>State parameter passed from client</UserHelpText> </ClaimType> </ClaimsSchema>
2. 从授权码流中捕获state参数
接下来,找到你用来配置授权码流的<TechnicalProfile>(通常是基于OAuth2协议的技术配置,比如OIDC-OpenIdConnect这类),在它的<OutputClaims>节点里添加state声明,这样B2C就会把客户端发送的state参数捕获到这个声明中:
<TechnicalProfile Id="OIDC-OpenIdConnect"> <DisplayName>My IDP</DisplayName> <Protocol Name="OpenIdConnect" /> <!-- 其他配置项... --> <OutputClaims> <!-- 已有的输出声明... --> <OutputClaim ClaimTypeReferenceId="state" PartnerClaimType="state" /> </OutputClaims> <!-- 其他配置项... --> </TechnicalProfile>
这里的PartnerClaimType="state"是告诉B2C从授权请求的响应里读取state字段的值,映射到我们定义的state声明上。
3. 将state参数作为输入传递给REST API
最后,找到你用来调用REST API的<TechnicalProfile>(通常是基于Restful协议的技术配置),在它的<InputClaims>节点里添加state声明,这样这个参数就会被作为请求参数传递给你的REST API:
<TechnicalProfile Id="REST-GetExtendedClaims"> <DisplayName>Get Extended User Claims</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://your-api-url/endpoint</Item> <Item Key="AuthenticationType">None</Item> <!-- 根据你的API认证方式调整 --> <Item Key="SendClaimsIn">Body</Item> <!-- 可以是Body/QueryString,根据API接收方式选择 --> </Metadata> <InputClaims> <!-- 已有的输入声明... --> <InputClaim ClaimTypeReferenceId="state" /> </InputClaims> <!-- 其他配置项(比如OutputClaims、UseTechnicalProfileForSessionManagement等)... --> </TechnicalProfile>
同时要注意,调用REST API的编排步骤(<OrchestrationStep>)必须放在授权码流技术配置的步骤之后,确保state声明已经被成功捕获。
额外注意事项
- 如果客户端传递的state是经过编码的(比如Base64),你可以在自定义策略中添加一个ClaimsTransformation来解码它,再传递给API。
- 要确保
state声明在整个流程中是可访问的,比如在编排步骤的<Claims>节点里包含它,或者通过OutputClaims传递到后续步骤。
内容的提问来源于stack exchange,提问作者Sampath Dilhan
相关产品推荐
相关产品推荐

