代理(代理标识蓝图)代表常规登录用户使用标准 OAuth 2.0 协议及其所有功能。 用户委托功能使代理标识能够通过标准的 OAuth 2.0 On-Behalf-Of 流程(通过代理特定的身份模拟)代表已登录用户执行操作。 为代理标识分配了 OBO 访问所需的必要委派权限。 它要求用户同意访问其数据。
代理程序具有 Microsoft Entra ID 资源(API)应用程序的功能,并支持(OAuth2Permissions 和 AppURI)所需的 API 属性。 代理标识蓝图无法直接启动交互式授权(/authorize) 流。 他们必须从客户端应用程序接收用户令牌,然后执行 OBO 令牌交换。 Web 重定向 URI 只能在用于同意流程的蓝图上配置 (response_type=none),但与应用注册中配置的重定向 URI 相比,其功能有限。
Important
与父蓝图一样,子代理标识无法启动交互式 /authorize 流。 因此,用户无法以交互方式授予同意(尝试对子标识执行此操作会返回错误 AADSTS82014)。 相反,必须通过在父级代理标识蓝图上配置可继承权限,来预先授予所需的委派权限。 确保管理员确实已针对该蓝图同意这些权限。 然后,子代理标识将继承这些范围,而无需触发交互式同意提示。 有关分步指南,请参阅 配置代理标识蓝图的可继承权限。
Warning
Microsoft 建议使用经认可的 SDK(如 Microsoft.Identity.Web 和 Microsoft Entra ID 身份验证 SDK(sidecar)库)来实现这些协议。 手动实现这些协议非常复杂且容易出错,并且使用 SDK 有助于确保安全性和符合最佳做法。
托管标识集成
托管身份是首选凭据类型。 在此配置中,托管标识令牌充当父代理标识蓝图的凭据,而标准 MSI 协议则适用于凭据获取。 此集成允许代理 ID 获得 MSI 安全和管理的全部优势,包括自动凭据轮换和安全存储。
协议步骤
交互式(/authorize)流不支持代理。 支持的授权类型是 client_credential, jwt-bearer以及 refresh_token。 该流涉及代理标识蓝图、代理标识和客户端凭据。 客户端凭据可以是客户端机密、客户端证书或联合标识凭据(FIC)。 如果可能,请使用托管标识来获取 FIC。
用户使用客户端进行身份验证,并获取用户访问令牌(客户端令牌,Tc)。
客户端将用户访问令牌(Tc)发送到代理身份蓝图,以代表用户执行操作。 这是用于 OBO 交换代理身份蓝图的令牌。
代理标识蓝图通过提供客户端凭据(如机密、证书或托管标识令牌 TUAMI)来请求交换令牌。 在此示例中,我们使用托管标识作为 FIC。 Microsoft Entra ID 将令牌 T1 返回到代理。
Warning
由于安全风险,客户端机密不应在生产环境中用作代理标识蓝图的客户端凭据。 而是使用更安全的身份验证方法 ,例如将联合标识凭据(FIC)与托管标识 或客户端证书配合使用。 这些方法通过消除直接在应用程序配置中存储敏感机密的需要,从而提供增强的安全性。
POST /oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id=AgentBlueprint &scope=api://AzureADTokenExchange/.default &fmi_path=AgentIdentity &client_assertion=TUAMI &grant_type=client_credentials-
fmi_path:代理身份的客户端 ID(应用 ID)。 此参数用于告知 Microsoft Entra ID,蓝图在令牌交换期间正在模拟哪个子代理标识。
其中,TUAMI 是用户分配托管标识 (UAMI) 的身份令牌。 此步骤返回 T1。
-
代理标识(代理标识蓝图的子级)发送 OBO 令牌交换请求。 此请求包括 T1 和用户访问令牌 Tc。 请注意,
client_id从蓝图(上一步)切换到此处的 代理标识 ,因为代理标识是执行 OBO 交换的实体。POST /oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id=AgentIdentity &scope=https://resource.example.com/scope1 &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion={T1} &grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer &assertion={Tc(aud=AgentIdentity Blueprint, oid=User)} &requested_token_use=on_behalf_ofMicrosoft Entra ID 在验证 T1 和 Tc 后返回资源令牌。 以下受众和链接要求适用:
- Tc (aud) == 代理身份蓝图客户端 ID。 用户断言的受众必须设置为该蓝图;面向其他资源的令牌(例如 Microsoft Graph)将被拒绝,并返回
AADSTS50013。 - T1 是通过
scope=api://AzureADTokenExchange/.default获取的,因此其aud是令牌交换资源,而不是蓝图。 Microsoft Entra ID 会验证 T1 已绑定到该蓝图(其azp为该蓝图),并且 T1 的sub(FMI 路径)会解析到执行该交换的子代理标识。
- Tc (aud) == 代理身份蓝图客户端 ID。 用户断言的受众必须设置为该蓝图;面向其他资源的令牌(例如 Microsoft Graph)将被拒绝,并返回
序列图
以下序列图展示了 OBO 流程
刷新令牌支持
刷新令牌可用于异步场景和后台进程。
POST /oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded
client_id=AgentIdentity
&scope=https://resource.example.com/scope1
&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
&client_assertion={T1}
&grant_type=refresh_token
&refresh_token={AgentIdentityRefreshToken}
权限继承
启用InheritDelegatedPermissions属性时,代理标识可以从其父代理标识蓝图继承委托的权限。 此继承机制允许代理标识使用已向其父应用程序授予的权限,从而减少了多实例方案的同意复杂性。 使用 FIC 模拟并跨多个实例实现高效的权限管理时,继承功能特别适用。 因此,继承仅在租户边界内起作用,确保权限范围保持在适当的组织界限之内。