当前位置: 首页 > 知识库问答 >
问题:

对服务到服务调用使用Azure托管标识

方焱
2023-03-14

现在我正在使用AAD应用程序使服务成为=

  1. AAD应用程序

流程如下所示:

  1. 服务A:从托管标识获取令牌
  2. 服务A:转到KeyVault,出示令牌并获取AAD应用程序的秘密
  3. 服务A:转到AAD,提供一个秘密并为特定资源请求一个令牌
  4. 服务A:拨打服务B
  5. 服务B:验证令牌和资源

我想知道是否可以向我的服务注册托管标识,因此如果提供托管标识令牌,则服务B可以信任服务A。类似于这样:

  1. 服务A:从托管身份获取令牌
  2. 服务A:致电服务B
  3. 服务B:验证令牌是否来自已注册的托管标识

是否可行?它是否违反了任何安全最佳做法?

更新:除了下面的答案之外,下面的堆栈溢出帖子描述了如何在一个租户中创建托管标识,以便在另一个租户中获取应用程序的角色声明

授予服务主体在其他租户中访问应用程序的权限

共有2个答案

潘俊
2023-03-14

对不起,我不能对朱纳斯的回复发表评论,因为我没有足够的声誉来评论。我只是想说,juunas推荐的解决方案只有在我重新启动VM后才对我起作用,当时我正试图使用用户分配的托管身份从VM获取令牌。重启VM的想法来自下面的文章。本文还推荐了与juunas完全相同的解决方案,但也提到了重新启动VM以清除缓存,以防token在遵循建议的步骤后仍然不显示角色。https://www.jasonfritts.me/2019/07/15/assigning-azure-ad-graph-api-permissions-to-a-managed-service-identity-msi/

鄂琛
2023-03-14

我写了一篇关于这个主题的博客文章:https://joonasw.net/view/calling-your-apis-with-aad-msi-using-app-permissions.

您完全可以做到,这意味着您无需使用任何机密从服务A呼叫服务B:)

不过,您需要使用PowerShell/Graph API为托管标识服务主体分配应用程序权限。没有用于此的UI。PowerShell命令示例:

New-AzureADServiceAppRoleAssignment -ObjectId 1606ffaf-7293-4c5b-b971-41ae9122bcfb -Id 32028ccd-3212-4f39-3212-beabd6787d81 -PrincipalId 1606ffaf-7293-4c5b-b971-41ae9122bcfb -ResourceId c3ccaf5a-47d6-4f11-9925-45ec0d833dec

ObjectId和PrincipalId都是MSI生成的服务主体的id。id是角色的id。ResourceId是API服务主体的id。

这是使用AzureAD PowerShell模块。

分配权限后,您的托管标识应该能够为您获得服务B的令牌。

但是,您的本地开发环境将需要一种不同的方法,因为那里没有托管标识。例如,您可以使用其中的客户端密码来测试对服务B的调用。

 类似资料:
  • 我在Azure中设置了两个应用程序服务。”父级和子级都公开APIendpoint。 子节点有endpointGet。 父节点有endpoint“获取”和“获取儿童”(使用HttpClient在儿童上调用“获取”)。 我希望所有子endpoint都需要通过托管身份和AAD进行身份验证,并且我希望所有父endpoint都允许匿名。但是在Azure中,我希望将父应用服务设置为具有调用子应用服务的权限。因

  • 我正在尝试设置Azure功能,以将我们的应用程序服务计划扩展到在工作时间更大,在工作时间以外更小。我从这个问题的答案中得出结论。 当我在本地运行它时,它可以工作,并且实际上在我们的Azure应用服务计划上执行了扩展(我相信是通过Azure CLI)。但是,当此Azure Function部署到Azure时,它找不到任何应用服务计划。它点击块并返回。我已为已部署的Azure Function打开托管

  • 我已经尝试按照本教程来验证我的服务总线对,但是,我得到了401。 我在设置中使用以下代码: 然后我这样称呼SB客户: 当我调用我得到一个401错误: 失败:Azure Messaging ServiceBus[82]为标识符myqueue-578624f3-f732-4a9b-2ab0-9adc01949a5a创建发送链接时发生异常。错误消息:“系统。UnauthorizedAccessExcep

  • 当尝试在Azure Gov中获取服务总线的托管标识令牌时,我尝试使用资源:https://servicebus.usgovcloudapi.net/而不是像商业(https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-managed-service-identity)那样https://servicebus.

  • Azure服务总线支持托管标识访问,但我发现向队列发送消息的唯一方法是使用这种需要代码和服务总线SDK的方法: 来源:https://github.com/Azure-Samples/app-service-msi-servicebus-dotnethttps://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-ma

  • 我在Azure App Services中部署了一个Docker容器。我有一个可以调用的公共API,它返回“Hello world”。 我想在我的应用程序中使用Azure托管标识,所以我在Azure门户中启用了它。根据以下文档,我启用了“系统分配”功能:https://docs.microsoft.com/en-us/azure/app-service/overview-managed-ident