配套:篇(十三)多租户隔离
定位:篇13 解决了"一个网关服务多团队"的隔离与 RBAC——这是企业就绪的第一块。但企业真正把 MCP 推到生产,还会被另外三件事放倒:身份怎么跨系统传、花了多少钱说不清、错误看不出门道。本篇是篇13 的实战补完。
坑一 · 身份与授权(篇13 未竟之处)
篇13 的 RBAC 解决的是"这个租户的用户能看哪些工具"。但企业里还有一层更棘手的:用户身份怎么从上游一路带到 MCP 服务端。
- 过渡方案:
X-User-Id头声明(见篇九 L3)——但它是"断言不是验证",伪造、委托链、凭证轮换、audience/issuer 校验都防不住,仅限内部可信网络。 - 生产方案:对接企业 IdP(Entra ID / OIDC),走OAuth 2.1,用可验证令牌带
issuer + audience;或等ID-JAG / DPoP落地(篇九已详述迁移路径)。 - 跨系统更尖锐:Agent 代表用户去调另一个 Agent / 另一个服务时,confused deputy(权威误用)和token passthrough(令牌透传)会比单跳更危险——令牌被带到不该去的地方,或agent 用自己的身份"顶替"用户干了越权的事。这正是 2026-07-28 规范列为 MUST 缓解的陷阱,只能靠含 audience 校验的可验证令牌根治。
相关阅读 → 篇(九) L3:本坑的"过渡→生产"升级路径在那里讲透了,本篇不重复,只点出"多跳场景下更危险"。
坑二 · 预算 / 资源管控(财务黑洞)
这是企业最痛苦、篇13 完全没覆盖的坑。
现象:MCP 网关一开,全公司都来调工具,月底老板问"花了多少、谁花的",答不上来。根因是计量计费 metadata 缺失——协议层没强制带成本归属信息。
怎么做(按租户 / 按工具计量):
// 每次工具调用记一笔:租户 + 工具 + token + 单价(demo 用 mock 单价)Stringkey="cost:"+tenantId+":"+toolName+":"+day;redis.opsForHash().increment(key,"calls",1);redis.opsForHash().increment(key,"tokens",promptTokens+completionTokens);// 定时聚合出"某租户某工具本月成本"再叠上配额 / 限流 / 熔断(篇十一 L5 已讲),避免单个租户把额度刷爆。
⚠️待实测:本机跑通后补"某租户某工具本月成本"查询示例与聚合脚本。单价用 mock 值,真实单价以云厂商账单为准,别用 demo 数当财务依据。
相关阅读 → 篇(十一) L5 限流:预算管控的"闸"那一半在那里。
坑三 · 错误处理
工具一多,错误就五花八门。裸抛500在生产里等于没说。
- 工具级错误码体系:别只抛异常,定义一套
McpBizErrorCode枚举(如TOOL_NOT_FOUND / PARAM_INVALID / UPSTREAM_TIMEOUT / RATE_LIMITED),让调用方和日志都能区分"谁的错"。 - 重试 / 退避 + 幂等协同:瞬时失败靠篇十一的退避重试;有副作用的工具靠篇八的幂等键——两者必须一起设计,否则"重试两次 = 下两次单"。
- 结构化错误日志:沿篇九 L6,错误也打结构化日志(含租户、工具、错误码、耗时),排查才快。
- 跨 Agent 错误传播:当 A2A 多 Agent 协作(篇十七)时,错误会跨 Agent 边界传播,需要在边界处统一错误模型,避免下层细节泄漏成上层事故。
相关阅读 → 篇(八)幂等、篇(十一)退避重试、篇(九) L6 审计。
隐藏坑 · 工具级 Schema 版本治理
升级困难是另一个隐形杀手:一个工具改了入参结构,老客户端全挂。
- 版本号 + 兼容策略:工具 manifest 带
schemaVersion,破坏性变更升主版本并灰度(呼应篇十二工具治理 / 状态机)。 - 破坏性变更灰度:新版本先对白名单租户开放,观察错误率再全量——和篇八的"老客户端兼容端点"是同一思路。
企业部署自查清单
| 线 | 检查项 | 必做? |
|---|---|---|
| 身份 | 用户身份从上游到 MCP 服务端可验证(非 X-User-Id 裸声明) | 必做(公网) |
| 身份 | audience/issuer 校验,防 confused deputy / token passthrough | 必做(多跳) |
| 预算 | 按租户/工具的成本计量已落地 | 必做(企业) |
| 预算 | 配额/限流/熔断已配置 | 必做 |
| 错误 | 工具级错误码体系 | 必做 |
| 错误 | 重试+幂等协同、结构化错误日志 | 必做 |
| 版本 | 工具 schema 版本号 + 破坏性变更灰度 | 建议 |
诚实边界
- 预算计量用 mock 单价演示,真实成本口径以云账单为准,避免财务误导。
- 本篇是篇13 的实战补完,不重复篇13 已讲的租户隔离与 RBAC。
- 真实聚合脚本、跨 Agent 错误传播示例为待实测项,占位待补。