在我的 Azure 环境中,我有一个函数 (azf-A),它使用应用程序 B 中的机密来访问应用程序 C。
azf-A 用于连接 C 的 JWT 令牌具有以下属性:
"aud": "api://ccc-ccc-ccc-ccc" // Api of app C
"appid": "bbb-bbb-bbb-bbb" // Client id of app B
应用程序 C 已将“bbb-bbb-bbb-bbb”设置为授权客户端 ID,因此上述设置可以正常工作。
为了增强安全性,我想消除秘密或证书的使用,但仍然需要功能 A 能够创建一个以“bbb-bbb-bbb-bbb”作为其 appid(客户端 ID)的令牌,因为应用程序 C 已退出我的控制范围内,仅授权应用程序 B。
到目前为止我尝试过什么?
我探索了 Azure 的联合凭据功能,该功能允许其他身份模拟该应用程序。但是,我不确定如何实施这种方法。
我也尝试实现代表流程,但得到了异常 AADSTS7000114:“应用程序 'bbb-bbb-bbb-bbb' 不允许进行应用程序代表调用”。
我设法找到了解决方案。希望这会对有类似需求的人有所帮助。
这是我采取的方法:
var managedIdentityAssertion = new ManagedIdentityClientAssertion(UserAssignedId);
var confidentialClientApp = ConfidentialClientApplicationBuilder
.Create("bbb-bbb-bbb-bbb")
.WithClientAssertion(async (AssertionRequestOptions options) => await managedIdentityAssertion.GetSignedAssertion(default))
.Build();
var authenticationResult = await confidentialClientApp
.AcquireTokenForClient(new[] { "api://ccc-ccc-ccc-ccc/.default" })
.WithTenantIdFromAuthority(AuthorityUri)
.ExecuteAsync();
var token = authenticationResult.AccessToken;