如何在不使用 Azure 中的机密或证书的情况下获取具有特定客户端 ID 的令牌?

问题描述 投票:0回答:1

在我的 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' 不允许进行应用程序代表调用”。

azure jwt azure-functions federated-identity
1个回答
0
投票

我设法找到了解决方案。希望这会对有类似需求的人有所帮助。

这是我采取的方法:

  1. 创建了新的托管身份。
  2. 添加了用户分配给功能 A 的身份。
  3. 在应用程序 B 中,我使用身份的对象 ID 创建了联合凭证。
  4. 在函数A中使用以下代码来创建令牌:
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;
© www.soinside.com 2019 - 2024. All rights reserved.