在Azure AD B2C中处理随机查询字符串值
AD B2C读取动态查询参数并写入JWT的解决方案
场景参考说明
这个场景属于AD B2C自定义策略中传递和保留请求参数的典型场景,AD B2C原生支持通过声明解析器获取请求中的查询参数,并将其注入到返回的JWT令牌中。
配置修改步骤
1. 定义声明类型
首先在策略的<BuildingBlocks>下的<ClaimsSchema>中,为需要读取的参数添加对应的声明类型,比如针对示例里的xyz和token参数:
<ClaimsSchema> <ClaimType Id="xyz"> <DisplayName>XYZ Parameter</DisplayName> <DataType>string</DataType> </ClaimType> <ClaimType Id="token"> <DisplayName>Token Parameter</DisplayName> <DataType>string</DataType> </ClaimType> </ClaimsSchema>
2. 调整现有技术配置文件
修改你提供的Get-Parameters技术配置,替换为对应参数的声明解析表达式,确保启用声明解析:
<ClaimsProvider> <DisplayName>Check Parameters</DisplayName> <TechnicalProfiles> <TechnicalProfile Id="Get-Parameters"> <DisplayName>Profile to extract request query parameters</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item> </Metadata> <OutputClaims> <!-- 读取URL中的xyz参数 --> <OutputClaim ClaimTypeReferenceId="xyz" DefaultValue="{oauth-kv:xyz}" AlwaysUseDefaultValue="true"/> <!-- 读取URL中的token参数 --> <OutputClaim ClaimTypeReferenceId="token" DefaultValue="{oauth-kv:token}" AlwaysUseDefaultValue="true"/> </OutputClaims> </TechnicalProfile> </TechnicalProfiles> </ClaimsProvider>
- 核心修改:把
{oauth-kv:my_parameter}替换为实际的参数名,比如{oauth-kv:xyz}和{oauth-kv:token},每个参数对应一个<OutputClaim>节点。 - 语法说明:
{oauth-kv:参数名}是AD B2C的声明解析器语法,专门用于提取请求URL中的查询参数值。
3. 在用户旅程中调用该技术配置
将Get-Parameters技术配置添加到用户旅程的早期步骤中(比如登录/注册流程起始阶段),确保参数在流程启动时就被读取:
<UserJourney Id="SignUpOrSignIn"> <OrchestrationSteps> <!-- 保留原有步骤,插入以下步骤 --> <OrchestrationStep Order="2" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="GetParametersExchange" TechnicalProfileReferenceId="Get-Parameters"/> </ClaimsExchanges> </OrchestrationStep> <!-- 后续登录/注册步骤 --> </OrchestrationSteps> </UserJourney>
4. 将声明添加到令牌输出
最后,在信赖方技术配置(通常是PolicyProfile)中添加这些声明,确保它们被包含在返回给应用的JWT令牌里:
<RelyingParty> <DefaultUserJourney ReferenceId="SignUpOrSignIn"/> <TechnicalProfile Id="PolicyProfile"> <DisplayName>PolicyProfile</DisplayName> <Protocol Name="OpenIdConnect"/> <OutputClaims> <!-- 保留原有声明 --> <OutputClaim ClaimTypeReferenceId="displayName"/> <OutputClaim ClaimTypeReferenceId="givenName"/> <!-- 新增自定义参数声明 --> <OutputClaim ClaimTypeReferenceId="xyz"/> <OutputClaim ClaimTypeReferenceId="token"/> </OutputClaims> <SubjectNamingInfo ClaimType="sub"/> </TechnicalProfile> </RelyingParty>
关键注意事项
- 参数名大小写敏感:
oauth-kv解析器对参数名大小写严格匹配,必须和Web应用传递的参数名完全一致。 - 空值处理:
AlwaysUseDefaultValue="true"会在参数不存在时将声明设为空字符串,避免流程报错。 - 安全校验:如果参数包含敏感信息,建议在策略中添加验证步骤,确保参数格式符合预期,防范注入风险。
内容的提问来源于stack exchange,提问作者CloudSpace03
相关产品推荐
相关产品推荐

