有一种(几乎)未记录的方式来使用数字孪生 API,而无需代理流程。我将它用于自动化任务以操作 ADT 的内容或为某些应用程序提供数据的只读视图。这一切都始于角色分配。在我第一次创建 ADT 实例时,请参阅 YAML 中的这个 sn-p。
- 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
this page 中描述了 ServicePrincipalId 对象类型,但在任何示例中都不再提及。这个 sn-p 将空间管理员权限授予服务主体。然后,您可以使用客户端密钥来检索允许您访问 ADT 的访问令牌。在 Azure Active Directory 中为 ADT 进行应用注册时,请转到 Certificates & Secrets 并创建一个新的客户端密码。
下一步是检索服务主体的objectId,这不是应用注册的objectId。当您转到应用注册的概览选项卡时,您可以复制应用程序 ID 并在云控制台中执行以下命令:
az ad sp show --id {the id you copied}
这将显示有关您的服务主体的许多详细信息,包括被反对的内容。也复制这个。
快到了,要检索访问令牌,您需要 4 件事:
- 授权:https://login.microsoftonline.com/{您的租户 ID}
- ClientId:您的应用注册的应用 ID。
- ClientSecret:您创建的客户端密码。
- 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);