如何使用服务主体访问 azure digital twin API?

How to access azure digital twin API using Service Principal?

我的用例是每当我在 Azure 函数中从 Cosmos DB 获得触发器时,需要在没有任何人工交互的情况下与 Azure 数字孪生 API 进行交互。
从下面link,我了解到我们可以使用服务主体来实现它。
Is it possible to configure Azure Digital Twins API access for a Daemon App?

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

提前致谢。

1)What type of authentication is required and how the flow will be?

如您所指的post,您应该使用OAuth 2.0 On-Behalf-Of flow。 主要流程在这里:Call Digital Twins from a middle-tier web API.

2)If it is Oauth2, what is the grant type and scope for accessing digital twin?

可以参考这个sample:

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

而对于 scope,它应该是您要访问的数字双胞胎 API。 (例如空间、设备、用户或传感器)。参见 API summary

有一种(几乎)未记录的方法可以在没有 On-Behalf-Of 流程的情况下使用数字孪生 API。我将它用于自动化任务,以操纵 ADT 的内容或为某些应用程序提供 read-only 数据视图。这一切都始于角色分配。请参阅我在首次创建 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 object 类型在 this page 中进行了描述,但在任何示例中都没有再次提及。此代码段授予服务主体 Space 管理员权限。然后,您可以使用客户端密码来检索允许您访问 ADT 的访问令牌。在 Azure Active Directory 中为 ADT 进行应用程序注册时,转到 Certificates & Secrets 并创建一个新的客户端密钥。

下一步是检索服务主体的 objectId,这是 而不是 应用程序注册的 objectId。当您转到应用程序注册的概览选项卡时,您可以复制应用程序 ID 并在云控制台中执行以下命令:

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

这将显示有关您的服务委托人的许多详细信息,包括 objected。也复制这个。 快到了,要检索访问令牌,您需要 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;

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

httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);