0

我的用例是每当我从 Azure 函数中的 Cosmos DB 获得触发器时,需要在没有任何人工交互的情况下与 Azure 数字孪生 API 进行交互。
从下面的链接中,我了解到我们可以使用服务主体来实现它。
是否可以为守护程序应用配置 Azure 数字孪生 API 访问?

但我不知道如何使用数字孪生 API 对服务主体进行身份验证。
1)需要什么类型的身份验证以及流程如何?
2)如果是Oauth2,访问数字孪生的授权类型和范围是什么?

提前致谢。

4

2 回答 2

2

有一种(几乎)未记录的方式来使用数字孪生 API,而无需代表流程。我将它用于自动化任务以操作 ADT 的内容或为某些应用程序提供数据的只读视图。这一切都始于角色分配。在我第一次创建 ADT 实例时,请参阅 YAML 中的这段代码片段。

- roleId: 98e44ad7-28d4-4007-853b-b9968ad132d1 # Space Administrator
  objectId: abcd1234-5556-44a2-1234-402dbd999619 # Service Principal object ID
  objectIdType: ServicePrincipalId
  tenantId: 1234567-8901-2345-abcd-123456789 # Azure subscription tenant

此页面上描述了 ServicePrincipalId 对象类型,但在任​​何示例中都不再提及。此代码段授予服务主体的空间管理员权限。然后,您可以使用客户端密钥来检索允许您访问 ADT 的访问令牌。在 Azure Active Directory 中为 ADT 进行应用注册时,请转到证书和机密并创建一个新的客户端机密。 在此处输入图像描述

下一步是检索 Service Principal 的 objectId,这不是应用程序注册的 objectId。当您转到 App Registration 的 Overview 选项卡时,您可以复制 Application ID 并在云控制台中执行以下命令:

az ad sp show --id {the id you copied}

这将显示有关您的服务主体的许多详细信息,包括反对的内容。也复制这个。快到了,要检索访问令牌,您需要 4 件事:

  1. 授权:https ://login.microsoftonline.com/ {您的租户 ID}
  2. ClientId:您的应用注册的应用ID。
  3. ClientSecret:您创建的客户端密码。
  4. DigitalTwinsAppId:这始终是 0b07f429-9f4b-4714-9392-cc5e8e80c8b0

在 .NET Core 中检索访问令牌

var authContext = new AuthenticationContext({Authority});
var clientCredential = new ClientCredential({ClientId}, {ClientSecret});
var result = await authContext.AcquireTokenAsync({DigitalTwinsAppId}, clientCredential);
return result.AccessToken;

将其添加到您的标头(下面的 HttpClient 示例),您就可以开始了!

httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
于 2020-04-23T07:11:02.603 回答
0

1)需要什么类型的身份验证以及流程如何?

正如您提到的帖子,您应该使用OAuth 2.0 On-Behalf-Of flow。主要流程在这里:从中间层 Web API 调用数字孪生

2)如果是Oauth2,访问数字孪生的授权类型和范围是什么?

您可以参考此示例

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer

而对于scope,它应该是您想要访问的数字孪生 API。(例如空间、设备、用户或传感器)。请参阅API 摘要

于 2020-04-23T05:10:10.697 回答