Sunday 的面试指南

Agent 调用 MCP 工具时,用户权限应该在哪里校验?

🧑‍💻 面试官:Agent 通过 MCP 查询订单,权限在哪里检查?

🙋‍♂️ 我:服务端要检查凭证和权限,不能只靠提示词限制。

🧑‍💻 面试官:用户已经登录,也有查询订单的权限。他让模型填一个别人的订单号,可以查吗?

🙋‍♂️ 我:还要检查这条订单是否在他的授权范围内。

🧑‍💻 面试官:如果 MCP Server 用一个管理员账号访问下游系统,这个检查又由谁负责?

能连接服务器、能调用工具、能操作这条数据,是三个不同的问题。鉴权必须一直检查到实际要访问的业务对象。

面试速答(60 秒版)

Agent 调用 MCP 工具时,模型负责提出工具和参数,权限要由可信服务检查,不能让模型判断自己有没有权限。

对于需要授权的 HTTP MCP 服务,服务器先验证访问令牌是否有效、是否是签发给自己的,以及是否具备本次请求需要的权限。随后,处理业务操作的服务还要根据真实用户、租户和目标对象继续校验。

例如用户能调用查询订单工具,不代表他能查所有订单。用户身份应该来自已验证的会话或凭证,不能相信模型在参数里填写的用户编号。

MCP Server 访问下游服务时,也要使用适用于下游的凭证和授权方式,不能把收到的令牌不加区分地直接转发。

因此,客户端可以提前过滤工具和提示审批,但最终限制仍需在服务端落实,并保留必要的操作审计。

MCP 鉴权,检查到哪一层?

知识点详解:沿着一次 MCP 调用检查权限

用户登录成功,只回答了其中一个问题

假设咱们做一个企业订单助手。甲公司的员工希望查询订单,AI 应用通过 MCP Client 调用订单 MCP Server,后者再访问订单业务服务。

一次请求可能经过这些环节:用户会话、AI 应用、MCP Client、MCP Server、订单业务服务。

模型在其中提出“查询订单 O-208”,但它输出的参数只是待处理的数据。如果 O-208 实际属于乙公司,服务端必须拒绝,不能因为模型认为这是合理查询就放行。

这里至少有三层判断:请求方身份是否可信,是否允许查询订单,以及是否允许查询 O-208。前两层通过,不能省略第三层。

MCP 接口这一层,要检查什么?

以受保护的 HTTP MCP 服务为例,MCP Server 需要按令牌类型和授权方案,验证签发方、有效性、有效期、目标受众等信息,再检查请求需要的授权范围。

其中“目标受众”可以简单理解为:这张访问凭证究竟是发给哪个服务使用的。 用户拿着另一个服务的有效令牌,并不意味着订单 MCP Server 就应该接受它。令牌也不一定是 JWT,不能把所有实现都写成“解码一下 JWT 就完成鉴权”。

按本次核验的 MCP 2026-07-28 授权规范,这一授权流程针对 HTTP 传输;STDIO 的凭证处理不同,不能直接照搬。协议允许某些实现不启用授权,也不代表承载私有订单数据的产品可以省略访问控制。

凭证应由客户端与服务端的可信代码管理,不需要放进模型上下文。模型只需知道当前可使用的能力,不需要看到可以复制出去的访问令牌。

进入工具之后,还要检查目标对象

模型可能提出下面几个业务参数:订单号、要查看的字段、查询时间范围。

而当前用户、所属租户和可信权限信息,应该从已经验证的上下文中取得。如果工具接口允许传租户参数,服务端也必须校验它是否属于当前授权范围,不能直接拿模型提供的值当过滤条件。

检查位置需要回答的问题
MCP Server 的认证入口凭证是否有效,是否确实用于访问本服务?
工具处理入口当前主体是否允许执行这个操作?
业务数据访问层当前主体是否有权访问这条订单及这些字段?
高风险动作入口是否还需要审批,当前参数是否与审批一致?

检查不一定分散在四套独立服务里,但这些责任不能漏掉。可以复用统一策略服务,也可以在可信业务边界集中执行。

针对订单查询,最好在数据读取时就限定授权范围,而不是先把全量数据交给模型,再要求它“不要展示别人的订单”。模型一旦读到,数据隔离就已经失败了。OWASP 的对象级授权说明描述的正是这类风险。

身份不能由模型参数说了算

MCP Server 的下游账号,不能掩盖真实用户

如果 MCP Server 使用一个权限很大的服务账号访问订单服务,下游可能只看到“服务账号有权查询”,却不知道请求来自甲公司员工。

此时必须有明确的授权设计:由可信服务在调用前落实用户和对象权限,或者通过适当的委托机制,让下游获得可验证的用户授权上下文。不要仅在普通参数里附一个用户 ID,就声称实现了身份委托。

连接两个系统时,还要区分两段凭证。MCP 客户端访问 MCP Server 的令牌,通常不能直接当成下游订单 API 的令牌使用。下游凭证需要按目标服务的授权方式获取和管理。

MCP 安全实践明确反对令牌透传这种做法,尤其不能接受不是签发给本 MCP Server 的令牌,再原样转交下游。接入方便,不能成为跨越凭证边界的理由。

工具列表过滤和人工确认,各能解决什么?

应用可以不向用户展示没有权限的工具,减少模型误选;对修改订单等动作,可以要求用户确认。这些都很有用,但不是最终防线。

因为攻击者可能绕过界面直接构造请求,或者用户权限在任务执行期间发生变化。工具真正执行时,仍然要重新检查。

人工确认也要绑定具体动作与参数。如果用户确认的是订单 O-208,模型之后把参数改成另一条订单,原来的确认就不能继续沿用。

测试时,除了验证正常请求,还应主动更换订单号、租户、权限范围和令牌目标服务,检查服务端是否拒绝。日志记录谁请求了什么、针对哪个对象、为什么允许或拒绝,但不要把完整访问令牌写进日志。

面试官继续追问

模型能看见某个工具,是不是就说明它有权调用?

不能。目录过滤只能改善使用体验和降低误调用,不能代替执行时鉴权。工具列表可能过期,调用也可能不是通过正常模型路径发起的,因此服务端必须独立判断。

使用本地 STDIO MCP,就没有权限问题了吗?

仍然有。只是不用直接套用 HTTP 的 OAuth 流程。需要管理进程可读的凭证、文件、网络和系统权限。如果本地服务又被代理给多个远程用户,还要设计用户隔离,不能因为底层是本地进程就默认所有调用可信。

用户说“我同意查询所有订单”,可以提升权限吗?

不可以。用户意愿不能扩大其账号本来没有的权限。审批只能在已授予的权限范围内确认具体动作,不能替代管理员授权或组织策略。

面试速记卡

  • 模型职责:提出动作和参数,不负责授予自己权限。
  • 接口授权:验证访问凭证、目标服务和所需权限范围。
  • 业务授权:继续检查真实用户对具体数据的访问权限。
  • 下游调用:使用适用的凭证与委托机制,不直接透传令牌。
  • 最终边界:目录过滤和用户确认都不能代替服务端检查。
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历