代理用户角色扮演使代理身份能够通过代理用户在用户上下文中运行,将用户权限与自主操作相结合。 在此方案中,代理标识蓝图(演员 1)模仿代理标识(演员 2),其又使用 FIC 模仿代理用户(主体)。 访问的权限范围仅限于分配给代理标识的委派。 代理用户只能由单个代理标识模拟。
警告
Microsoft建议使用批准的 SDK(如 Microsoft.Identity.Web 和 Microsoft 代理 ID SDK 库)来实现这些协议。 手动实现这些协议非常复杂且容易出错,并且使用 SDK 有助于确保安全性和符合最佳做法。
托管标识集成
托管身份是首选凭据类型。 在此配置中,托管标识令牌充当父代理标识蓝图的凭据,而标准 MSI 协议则适用于凭据获取。 此集成允许代理 ID 获得 MSI 安全和管理的全部优势,包括自动凭据轮换和安全存储。
协议步骤
接下来是协议步骤。
代理标识蓝图请求一个交换令牌(T1),用于模拟代理身份。 代理标识蓝图提供客户端凭据,可以是机密、证书或用作 FIC 的托管标识令牌。
警告
由于安全风险,客户端机密不应在生产环境中用作代理标识蓝图的客户端凭据。 而是使用更安全的身份验证方法 ,例如将联合标识凭据(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_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion=TUAMI &grant_type=client_credentials其中 TUAMI 是用户分配的托管标识(UAMI)的 MSI 令牌。 这会返回令牌 T1。
代理标识请求用于代理用户模拟的令牌 (T2)。 代理标识将 T1 显示为其客户端断言。 Microsoft Entra ID 在验证 T1 (aud) == 代理标识父应用 == 代理标识蓝图后,将 T2 返回到代理标识。
POST /oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id=AgentIdentity &scope=api://AzureADTokenExchange/.default &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion={T1} &grant_type=client_credentials这会返回令牌 T2。
然后,代理身份将 OBO 令牌交换请求发送到 Microsoft Entra ID,包括 T1 和 T2。 Microsoft Entra ID 验证 T2 (aud) == 代理身份。
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} &assertion={T2} &username=agentuser@contoso.com &grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer &requested_token_use=on_behalf_ofMicrosoft Entra ID 颁发资源令牌。
序列图
以下序列图显示了代理用户身份模拟过程
要实现代理用户模拟,凭据链需要遵循以下模式:代理标识蓝图→代理标识→代理用户。 此链中的每个步骤都使用上一步中的令牌作为凭据,从而创建安全委派路径。 必须对这两个阶段使用相同的客户端 ID 来防止特权升级攻击。