如何基于Azure B2C为Azure应用程序网关实现SSO保护多后端服务
解决方案:通过Azure B2C为Azure应用程序网关实现统一SSO
核心前提
Azure应用程序网关本身不提供内置的SSO/OAuth2.0认证能力,必须借助额外组件实现网关入口的统一身份验证,同时将用户信息传递到后端App Service。以下是两种实用落地方案:
方案一:Azure Front Door(AFD) + Azure B2C(推荐)
AFD支持直接集成Azure B2C实现全局SSO,可作为应用程序网关的前置入口统一处理认证:
步骤1:配置AFD与Azure B2C集成
- 为AFD绑定自定义域名和SSL证书
- 给AFD路由规则启用「身份验证」,选择Azure B2C作为身份提供者,配置租户ID、应用注册客户端ID及对应用户流(如登录/注册流)
- 设置会话管理参数(如Cookie过期时间)
步骤2:将AFD流量转发到应用程序网关
- 在AFD后端池添加应用程序网关的公网IP或域名
- 配置路径匹配规则(如
/orders/*、/warranty/*),确保流量正确路由到网关
步骤3:传递用户认证信息到后端
- 在AFD认证设置中启用「将用户声明转发到后端」,勾选需要传递的字段(如
objectId、email、displayName) - 这些声明会以HTTP请求头形式(如
X-MS-AAD-OBJECT-ID、X-MS-AAD-EMAIL)经网关传递给App Service,后端可直接读取这些请求头实现授权逻辑
- 在AFD认证设置中启用「将用户声明转发到后端」,勾选需要传递的字段(如
方案二:Azure API Management(APIM) + Azure B2C
如果后端以API服务为主,APIM是更贴合的选择:
步骤1:配置APIM与Azure B2C集成
- 在APIM中创建API,将后端指向应用程序网关的路由地址
- 为API添加「OAuth 2.0」认证策略,关联Azure B2C的用户流和应用注册信息
- 配置JWT令牌验证策略,拦截未授权请求
步骤2:传递用户声明到后端
- 在APIM入站策略中添加逻辑,从JWT令牌提取所需用户属性并写入请求头,示例策略片段:
<set-header name="X-USER-OBJECT-ID" exists-action="override"> <value>@{return context.Request.Headers.GetValueOrDefault("Authorization").Split(' ')[1].AsJwt()?.Claims.FirstOrDefault(c => c.Type == "oid")?.Value;}</value> </set-header>
- 在APIM入站策略中添加逻辑,从JWT令牌提取所需用户属性并写入请求头,示例策略片段:
步骤3:将APIM设为网关前置入口
- 调整DNS记录,将用户请求指向APIM,再由APIM转发到应用程序网关
备选方案:自定义认证代理容器
如果需要完全自定义认证逻辑,可在应用程序网关和后端之间部署OAuth2.0认证代理(如OAuth2 Proxy、Keycloak Gatekeeper),部署在AKS中:
- 配置代理与Azure B2C集成,处理登录/授权流程
- 将应用程序网关的后端池指向认证代理的服务地址
- 代理验证通过后,将用户声明添加到请求头再转发到对应App Service
关键注意事项
- 会话安全:确保AFD/APIM的会话Cookie配置
HttpOnly、Secure、SameSite等安全属性 - WAF防护:可保留应用程序网关的WAF,或在AFD层面启用WAF规则实现多层防护
- 声明按需传递:仅转发后端授权所需的用户属性,避免敏感信息泄露
- 验证测试:用Postman、curl等工具测试认证流程,检查请求头是否包含预期用户信息
内容的提问来源于stack exchange,提问作者Rohit Mistry
相关产品推荐
相关产品推荐

