⚡ 开篇速览:30 秒版本
MCP 原本的授权模型是「每个员工、对每个 MCP 服务器、各自点一遍 OAuth 授权弹窗」。个人用户连自己的工具没问题,但放进公司就是灾难:入职要手动连十几个服务器、安全团队管不住谁连了什么、个人账号和工作账号混在一起。
企业托管授权(Enterprise-Managed Authorization,EMA) 是 MCP 官方给出的答案:把「谁能连哪个服务器」这个决定,从每个员工手里收回来,交给公司已有的身份提供商(IdP,就是你公司统一登录用的那套系统,如 Okta) 。管理员在 IdP 里配一次策略,员工用公司账号登录一次,被批准的 MCP 服务器就全部自动连上——没有授权弹窗,没有逐个配置。
🎯 一句话记住 EMA 的边界
EMA 回答的是「这个用户能不能把这个客户端连到这个服务器、拿哪些权限范围 」;它永远不回答 「这个具体动作、此刻、对这个资源,该不该执行」。连接层它管,动作层留给你自己建(第五节详讲)。
🧭 背景与动机
之前的世界:授权税拖垮企业采用
MCP 在企业里的扩散是自下而上的——员工一个连接器一个连接器地装,授权是事后才被认真对待的问题。MCP 官方在 EMA 发布公告里直说:「连接的 MCP 服务器带来的授权与反复弹出的同意提示,是企业环境里管理连接性的最大痛点之一。」具体是三个问题:
每个员工要逐个授权每个服务器 :入职 onboarding 变成手动连一串服务,token 过期后还要再来一轮。
安全团队无法统一执行策略 :每个人各自授权,没有集中的批准/拒绝入口,也没有统一审计线索;离职回收权限要一个服务器一个服务器地撤。
工作与个人账号混淆 :没有机制强制使用公司身份,员工完全可能把个人账号连进工作工具,数据在两边悄悄流动。
结果就是官方说的「授权税」:数据和工具明明都在,但大多数处于「没连上」的关闭状态,或者各家发明自己的脆弱变通方案。
发展脉络
为什么这周又上了新闻?因为 InfoQ 等媒体在 7 月初集中报道了转正消息,且它正好卡在 MCP 2026-07-28 规范定稿前夕 ——那份「MCP 史上最大修订」把整个授权体系向 OAuth 2.1 / OpenID Connect 对齐,EMA 是这个大方向里最面向企业的一块。
🧩 核心概念与角色
先把四个角色分清(两个名字很像,别混)
关键区分:IdP 授权服务器 (公司身份系统)负责按组织策略判断「这个人可不可以」,发一张中间凭证后就退场;资源授权服务器 (MCP 服务器那边的发令牌方)验证这张凭证,发出真正用于调用的访问令牌。IdP 从头到尾不在工具调用的路径上 ——这一点决定了 EMA 的能力边界。
术语表
IdP(Identity Provider,身份提供商)
公司统一管理员工账号和登录的系统,如 Okta、Microsoft Entra。你每天上班「单点登录」用的就是它。
SSO(Single Sign-On,单点登录)
登录一次公司账号,各个内部系统都认。EMA 就是把 MCP 服务器也挂进这个「都认」的范围。
ID-JAG(Identity Assertion JWT Authorization Grant)
EMA 的核心新事物:IdP 在验证你的 SSO 身份、跑完公司策略后,签发的一张短命(约 5 分钟)的 JWT 凭证 ,只能对指定的一个服务器兑换一次访问令牌,用完即弃。基于 IETF 的 oauth-identity-assertion-authz-grant 草案。
令牌交换(Token Exchange,RFC 8693)
OAuth 的标准玩法:拿一种令牌(你的 SSO 身份令牌)去换另一种令牌(ID-JAG)。EMA 的「公司策略在此刻生效」就发生在这次交换里。
JWT Bearer 授权(RFC 7523)
另一个 OAuth 标准:客户端把一张 JWT 当作「授权依据」直接提交给授权服务器换访问令牌。ID-JAG 就是走这条路兑换的。
受保护资源元数据(PRM,RFC 9728)
MCP 服务器公开的一份「说明书」,告诉客户端「给我发令牌的授权服务器在哪」。EMA 的发现机制复用它。
XAA(Cross App Access,跨应用访问)
Okta 提出的跨应用授权协议,EMA 实质上是把它标准化进 MCP 扩展。Okta 是首个支持 EMA 的 IdP。
扩展(Extension)
MCP 的官方插件机制:反向域名命名(EMA 的 ID 是 io.modelcontextprotocol/enterprise-managed-authorization),独立仓库、独立版本,客户端和服务器双方声明才启用。
🏢 类比:办公楼门禁
老模型像一栋楼里每间办公室都装自己的门锁,新员工要挨个房间找管理员配钥匙。EMA 像公司前台(IdP)发一张工卡:HR 在系统里定好「工程部能进 3 楼机房和 5 楼实验室」,员工入职刷卡即通,离职一键注销全部权限。但注意——工卡只决定你能进哪些门 ,进门之后你在房间里做什么,门禁系统看不见(这就是 EMA 的边界)。
⚙️ 工作原理:完整流程
整个 EMA 流程是三个 OAuth 标准件的叠加:一次 OIDC/SAML 登录 + 一次 RFC 8693 令牌交换 + 一次 RFC 7523 JWT Bearer 兑换 。没有发明新的密码学,全是被验证过的标准积木。
逐步拆解
SSO 登录,拿到身份断言。 客户端对 IdP 跑一次普通的 OIDC(或 SAML)登录。公司设置的 MFA、条件访问在这一步照常生效。客户端拿到并保存一张身份断言(OIDC 的 ID Token;SAML 要先多换一步 refresh token)。
令牌交换,换取 ID-JAG。 客户端向 IdP 的 token 端点发起 RFC 8693 交换:带上身份断言、目标资源授权服务器(audience,必填)、目标 MCP 服务器标识(resource,可选)和想要的 scope。这是全流程中公司策略唯一运行的时刻 ——IdP 依据组、角色、条件访问规则裁决。被拒绝的服务器什么也不返回,对客户端来说等于「不存在」。
兑换访问令牌。 客户端把 ID-JAG 作为 RFC 7523 JWT Bearer 授权提交给资源授权服务器。后者验证签名、签发方、受众等,发回一张普通的 OAuth 访问令牌——且必须受众绑定 到 ID-JAG 里指定的那一个 MCP 服务器,拿去调别的服务器无效。
正常调用与静默续期。 之后就是普通 MCP:每次调用带 Bearer 令牌;令牌过期时用保存的身份断言静默重跑交换,无需用户再操作;只有身份断言本身过期才回到 SSO 登录。全程用户没见过任何一个授权弹窗。
ID-JAG 里面装了什么
它就是一张带特殊类型标记(typ: oauth-id-jag+jwt)的 JWT,关键字段(示例取自 Ehsan Hosseini 的规范解读文章):
{
"iss": "https://acme.idp.example", // 谁签的(公司 IdP)
"sub": "U019488227", // 用户(仅在 iss 内唯一,必须 iss+sub 连用)
"aud": "https://auth.chat.example/", // 给谁用(资源授权服务器)
"resource": "https://mcp.chat.example/", // 最终目标(那一个 MCP 服务器)
"client_id": "f53f191f9311af35",
"scope": "chat.read chat.history", // 权限上限(只能收窄,不能放大)
"exp": ..., "iat": ..., "jti": "..." // 约 5 分钟过期 + 防重放 ID
}
三个设计值得品味:短命 (约 5 分钟,兑完即弃,偷走也几乎没用)、单一目标 (一张凭证只对一个服务器,没有「万能票」)、scope 是天花板 (资源授权服务器只能发等于或小于凭证 scope 的令牌)。
客户端怎么发现服务器支持 EMA
两步查询,没有任何自定义端点:先通过服务器的受保护资源元数据(RFC 9728)找到它的资源授权服务器;再看该授权服务器的元数据里 authorization_grant_profiles_supported 数组是否包含 urn:ietf:params:oauth:grant-profile:id-jag。客户端自己则在能力声明的 extensions 映射里报出 EMA 的扩展 ID。扩展是双向可选的,任一方没声明就回落到标准授权流程。
⚠️ 时效提醒:能力声明的载体正在变
EMA stable 规范写作时,扩展声明放在 initialize 握手的 capabilities 里;而 2026-07-28 新规范取消了 initialize 握手 ,能力改为随每个请求的 _meta 传递、用 server/discover 按需获取。具体声明位置以官方 ext-auth 仓库的最新版本为准。
🛠️ 怎么用:三方各自的实现要点
EMA 涉及三个建设方。以下要点整理自官方扩展规范页与 Ehsan Hosseini 的实现清单(他的文章是目前对请求细节还原最完整的第三方解读)。
如果你是企业管理员(只想用,不写代码)
确认你的 IdP 支持:截至调研时只有 Okta (经其 Cross App Access / XAA)正式支持,其他 IdP 需要跟进各家路线图。
在 IdP 管理台把要开放的 MCP 服务器授权给对应用户组/角色;在客户端侧(如 Claude 企业管理台、VS Code 企业配置)配置组织级 IdP 端点。
验收标准:员工登录一次,被批准的连接器自动出现;在 IdP 里撤销后立即全局失效。
如果你在实现 MCP 客户端
发现顺序:PRM 找资源授权服务器 → 查其元数据确认 id-jag grant profile → 在能力声明里报出扩展。
IdP 配置做成组织级 设置——做成按用户配置是最经典的早期错误。
永远不要把用户重定向到资源授权服务器的授权页 :那个页面就是 EMA 要消灭的同意弹窗,跳过去等于退回老流程。
把「拿到的 scope 比申请的窄」当正常结果处理(按功能降级),不要报错。
尽早实现静默续期:用保存的身份断言重跑交换,才能让「登录一次」在长会话里成立。
如果你在实现资源授权服务器(MCP 服务器一侧)
在 token 端点接受 jwt-bearer 授权类型;拒绝一切 typ 头不是 oauth-id-jag+jwt 的断言 (接受其他类型 = 埋下混淆代理人漏洞)。
按租户维护受信 IdP 白名单 :你信任的不是「Okta」这个品牌,而是「这家客户的 Okta 租户」的特定 issuer + JWKS。这部分是协议外的管理台工程,要自己建。
校验全家桶:签名对 IdP 的 JWKS、aud 是自己、resource 是自己管的服务器、client_id 与认证客户端一致、时间字段留时钟偏移余量、jti 在凭证有效期内防重放。
用户身份键用 iss+sub,绝不能只用 sub;email 只用于老账号关联,不能作为授权依据。
签发的访问令牌必须受众限定到 resource 指的那一个服务器;scope 只收窄不放大;在元数据里广告 id-jag grant profile 让客户端能发现你。
🚧 边界:EMA 管到哪为止,剩下的归谁
这是全文最重要的一节,也是最容易被误读的一点。把「IdP 批准了这个连接」读成「这个连接是安全的」,是对规范的误读——规范自己在安全考量里写明:IdP 的可见性止于签发令牌的那一刻,不延伸到之后客户端与服务器之间的 MCP 流量 。
一个具体的例子
一个发布 agent 通过 EMA 连上了代码仓库服务器,且合法地持有写权限 scope(它确实有时需要写)。EMA 给它发了一张有效令牌——然后就没有然后了。任务执行中途,没有任何 EMA 机制阻止它删掉一个不该删的分支,或对任务范围之外的仓库动手。令牌说的是「这个用户可以在这里写」,对「这个动作、此刻、为了这个目的」一言不发。
补齐缺口:PDP / PEP 策略层
要管住动作层,必须在数据路径上 放东西:一个夹在客户端与服务器之间的执行点(PEP),每次调用都过它,它向独立的决策引擎(PDP,可用 OPA、Cedar、OpenFGA 这类策略引擎)询问「放行 / 拒绝 / 要求升级验证」,并可附带义务(遮蔽字段、要求人工批准、提级记录)。决策与执行分离,策略可以独立演进,每个决定都成为可签名的审计事件。Hosseini 文中给了一个 Rego 规则示意(如「工程组可在本组仓库读写但不可删除」「agent 发起的删除一律要人工批准」)。
💬 社区声音
Okta 身份标准总监 Aaron Parecki(EMA 所基于的 XAA 协议作者):「随着我们走向互联的 AI 工作力,安全不能是事后补丁。把 Cross App Access 协议嵌入 MCP 成为 EMA 扩展,我们把身份变成集中治理平面。」同时 SecurityWeek 等安全媒体提醒:授权集中化本身也改变了攻击面——IdP 成为更高价值的单点目标,agent 权限聚合后一次失陷的爆炸半径更大。两种声音都值得听。
🌍 生态与落地现状(截至 2026-07-16)
2+
客户端阵营:Anthropic 全家桶 + VS Code(预览)
7
首发支持的服务器:Asana、Atlassian、Canva、Figma、Granola、Linear、Supabase
≈5 分钟
ID-JAG 有效期 (短命、单目标、一次性)
Anthropic :在 Claude、Claude Code、Cowork 共享的 MCP 层实现了 EMA,管理员可跨三个产品统一授权 MCP 服务器。
Visual Studio Code :在 IDE 内加入 EMA 支持(v1.123 起,预览特性)。
服务器侧 :Atlassian 专门发文讲了如何用 XAA + ID-JAG 给 Rovo MCP 接入 EMA;Slack 等更多服务器在接入中。
典型场景 :新员工入职当天,登录公司 Okta 后 Claude/VS Code 里的 Linear、Figma、Atlassian 连接器自动可用;安全团队在 Okta 控制台看到跨所有连接器的统一审计;离职时一键撤销。Linear 工程负责人 Tom Moor 的评价:「登录一次、所有 MCP 连接器自动配好,相当神奇。」
⚖️ 对比与选型
维度 标准 MCP OAuth(逐服务器) EMA(企业托管) 静态 API Key / PAT
授权决定者 每个用户自己 公司 IdP 管理员 拿到 key 的任何人
用户体验 每服务器一次弹窗,过期重来 一次 SSO,零弹窗 手动粘贴配置
集中策略/审计 无 IdP 控制台统一 无(且难以轮换)
离职回收 逐服务器撤销 IdP 一键,全局生效 常被遗忘,长期风险
身份保证 可能混入个人账号 强制公司身份 无身份概念
适用场景 个人用户、消费级(仍是默认) 企业部署 应尽量淘汰
动作级控制 三者都没有 —— 一律需要另建 PDP/PEP 策略层
怎么选
个人/小团队 :标准 OAuth 流程就是为你设计的,EMA 是纯增量,不必理会。
用 Okta 的企业 :现在就能上,收益立竿见影(尤其 Anthropic/VS Code + 那 7 家服务器的组合)。
不用 Okta 的企业 :EMA 建立在开放的 IETF 草案上,其他 IdP 可以实现,但目前必须规划非 EMA 回退路径 。
自建 MCP 服务器的团队 :接入 EMA 是代码改造(接受新 grant 类型)而非配置开关,评估工作量时按第四节的清单走。
放进大图景:07-28 规范的授权加固
EMA 不是孤立事件。即将定稿的 MCP 2026-07-28 规范把整个授权底座向 OAuth 2.1 / OIDC 拉齐:MCP 服务器必须实现受保护资源元数据(RFC 9728)、客户端必须用资源指示符(RFC 8707)声明令牌目标(防止令牌被拿去打别的服务器)、客户端注册转向 CIMD(Client ID Metadata Documents,动态客户端注册 DCR 被弃用)、强制校验授权响应的 iss(防混淆攻击)、规范化 refresh token 行为。EMA 站在这些地基之上,负责「企业如何批量发放这一切」。
🕳️ 常见坑与限制
⚠️ 最容易踩的一个:MCP 令牌 ≠ REST API 令牌
EMA 流程发出的访问令牌受众限定于那一个 MCP 服务器 。它不是该厂商通用 REST API 的凭证——那套 API 在自己的授权服务器、受众和 grant 后面,是平行的另一个集成,不是 EMA 的赠品。Hosseini 特别点名这是团队摔得最狠的地方。
IdP 单一依赖 :目前只有 Okta 正式支持。不在 Okta 上的组织要么等,要么保留标准 OAuth 回退。(官方定位:EMA 是增量扩展,标准流程不废除。)
没有万能令牌 :每张 ID-JAG 只对一个服务器,连 N 个服务器就是 N 次交换。客户端要做好批量交换与缓存。
scope 粒度受制于服务器 :「工程部只读、市场部读写」这种控制,前提是服务器把读/写拆成了不同 scope;且这是签发时刻的一次性决定,不是逐调用检查。
服务器接入是代码改造 :接受 jwt-bearer + ID-JAG 校验 + 多租户 IdP 信任管理,不是配置开关;多租户信任(每客户的 issuer/JWKS/客户端映射)全在协议之外,要自建管理台。
「零弹窗」是把双刃剑 :用户不再看到授权画面,意味着用户也失去了「等等,这是要连什么?」的天然刹车。集中决策的质量完全取决于管理员策略配置的质量。
动作层裸奔 (再强调一次):EMA 落地后,「IdP 放行了连接」很容易在心理上被当成「安全了」。每一个进生产的 agent 部署,都仍需回答「谁在数据路径上看着每一次调用」。
规范仍在演进 :EMA 依赖的 ID-JAG 还是 IETF 草案(draft-ietf-oauth-identity-assertion-authz-grant);07-28 新规范又改变了扩展声明的载体。实现前以 ext-auth 仓库最新 stable 文本为准。
🎯 学完检验:三个自测问题
① 为什么说「公司策略只在一个瞬间运行」?那个瞬间是流程里的哪一步?② 一张 ID-JAG 被中途窃取,攻击者能拿它做什么、不能做什么(提示:typ / aud / resource / exp / jti 各挡住了什么)?③ EMA 上线后,你的发布 agent 误删分支的风险变小了吗?为什么没有——要靠什么补?
📚 学习资源
官方扩展规范页(必读) :Enterprise-Managed Authorization — modelcontextprotocol.io/extensions/auth/enterprise-managed-authorization,客户端/服务器/授权服务器三方要求
官方发布公告 :Enterprise-Managed Authorization: Zero-touch OAuth for MCP(2026-06-18,Paul Carleton)— blog.modelcontextprotocol.io/posts/enterprise-managed-auth/
stable 规范源文件 :github.com/modelcontextprotocol/ext-auth → specification/stable/enterprise-managed-authorization.mdx
最深入的第三方解读 :Ehsan Hosseini《EMA: what it actually does, and what it leaves to you》(2026-06-21)— 完整请求示例 + 双端实现清单 + 边界分析
IETF 草案(底层机制) :draft-ietf-oauth-identity-assertion-authz-grant(ID-JAG);配套读 RFC 8693(令牌交换)、RFC 7523(JWT Bearer)、RFC 9728(受保护资源元数据)
IdP 视角 :Okta Cross App Access(XAA)介绍 — okta.com/identity-101/cross-app-access-securing-ai-agent-and-app-to-app-connections/
服务器实战案例 :Atlassian《How We Brought Enterprise-Managed Authorization to Rovo MCP with XAA and ID-JAG》
大图景 :MCP 2026-07-28 规范 RC 公告(blog.modelcontextprotocol.io)+ WorkOS 的授权变更解读(workos.com/blog/mcp-2026-spec-agent-authentication)
调研说明
调研时间:2026-07-16。核心机制与生态事实取自当日抓取的 MCP 官方博客(发布公告全文)、InfoQ 报道、MCP 2026-07-28 RC 官方公告、WorkOS 规范解读与 Ehsan Hosseini 的规范级解读文章全文,关键事实均有官方一手来源或双源印证。请求报文细节(HTTP 示例、JWT 字段)转述自 Hosseini 对 stable 规范的解读,实现时请以 ext-auth 仓库最新规范文本为准。EMA 及其依赖的 IETF 草案仍在演进,快速迭代期请以官方最新文档为准。
来源清单
① Enterprise-Managed Authorization: Zero-touch OAuth for MCP — MCP 官方博客(2026-06-18):https://blog.modelcontextprotocol.io/posts/enterprise-managed-auth/(2026-07-16 抓取)
② AI Model Context Protocol Adds Centralised Auth for Enterprise — InfoQ(2026-07-06):https://www.infoq.com/news/2026/07/mcp-ema-enterprise-auth/(2026-07-16 抓取)
③ Enterprise-Managed Authorization for MCP — Ehsan Hosseini(2026-06-21):https://ehosseini.info/articles/mcp-enterprise-managed-authorization-ema/(2026-07-16 抓取)
④ The 2026-07-28 MCP Specification Release Candidate — MCP 官方博客(2026-05-21):https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/(2026-07-16 抓取)
⑤ The biggest MCP spec update ships July 28 — WorkOS(2026-06-18):https://workos.com/blog/mcp-2026-spec-agent-authentication(2026-07-16 抓取)
⑥ 扩展规范页与 ext-auth 仓库、Atlassian Rovo 案例、Okta XAA 页面:经搜索结果确认存在,未逐页核读,仅作延伸阅读。
⑦ SecurityWeek 对 EMA 安全争议的报道:https://www.securityweek.com/new-enterprise-ready-mcp-specification-brings-new-security-challenges/(据搜索摘要引用)