如何在Azure API Management网关中获取Azure B2C用户信息以过滤后端返回结果
Azure B2C保护的API Management响应过滤实现方案
前置准备
- 确保Azure B2C的用户流/自定义策略已完成配置,发放的访问令牌中包含
emails声明(B2C默认该声明为数组格式,首个元素为用户的主邮箱) - 确保Azure API Management(APIM)已完成B2C OAuth2.0授权服务对接,目标API已开启B2C令牌校验规则
- 后端API返回的响应为包含
email字段的JSON数组,若为嵌套结构可后续调整过滤规则适配
核心APIM策略配置
通过APIM的出站策略即可实现响应自动过滤,直接在目标API的策略配置页添加如下内容即可:
<policies> <inbound> <base /> <!-- 校验B2C令牌,若已在全局/产品层级配置可直接省略本段 --> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized."> <openid-config url="https://<你的B2C租户名>.b2clogin.com/<你的B2C租户名>.onmicrosoft.com/<你的用户流名称>/v2.0/.well-known/openid-configuration" /> <required-claims> <claim name="iss" match="any"> <value>https://<你的B2C租户名>.b2clogin.com/<你的B2C租户ID>/v2.0/</value> </claim> </required-claims> </validate-jwt> <!-- 提取当前访问用户的邮箱存入变量 --> <set-variable name="currentUserEmail" value="@{ var claims = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last()?.ParseJwt()?.Claims; if(claims == null || !claims.TryGetValue("emails", out var emails)) return ""; return emails.FirstOrDefault() ?? ""; }" /> </inbound> <backend> <base /> </backend> <outbound> <base /> <!-- 按当前用户邮箱过滤后端返回的JSON结果 --> <set-body>@{ var currentEmail = (string)context.Variables["currentUserEmail"]; if(string.IsNullOrEmpty(currentEmail)) return "[]"; var response = context.Response.Body.As<JArray>(); var filtered = response.Where(item => item.Value<string>("email") == currentEmail); return JArray.FromObject(filtered).ToString(); }</set-body> </outbound> <on-error> <base /> </on-error> </policies>
注意事项
- 若后端返回的不是顶层JSON数组,只需修改出站策略里的JPath取值逻辑即可适配
- 若你的B2C令牌中邮箱声明不是
emails字段,对应修改入站策略里的声明取值键名即可 - 邮箱匹配逻辑可自行调整,比如添加忽略大小写规则,只需要修改过滤条件里的判断逻辑即可
内容的提问来源于stack exchange,提问作者Walt
相关产品推荐
相关产品推荐

