使用 AAD 托管标识访问 Azure Sphere 公共 API
重要
这是 Azure Sphere(旧版)文档。 Azure Sphere(旧版)将于 2027 年 9 月 27 日停用,用户此时必须迁移到 Azure Sphere(集成)。 使用位于 TOC 上方的版本选择器查看 Azure Sphere(集成)文档。
可以使用此方法向任何支持 Azure Active Directory (AAD) 身份验证的服务进行身份验证,而无需在代码中使用任何凭据。 AAD 托管标识代表你处理服务主体的创建或续订。 它是一种特殊类型的服务主体,只能与 Azure 资源一起使用。 删除托管标识时,相应的服务主体也会自动移除。
系统分配:一些 Azure 服务允许直接在服务实例上启用托管标识。 例如,Azure App 服务。 启用系统分配的托管标识后,系统会在 Azure AD 中创建一个与该服务实例的生命周期相关联的标识。 因此,资源被删除时,Azure 会自动删除标识。 按照设计,只有该 Azure 资源可以使用此标识从 Azure AD 请求令牌。
先决条件
- 基于 Azure Sphere 的设备,具有开发功能。
- Azure Sphere 租户。
- 为 Azure Sphere 设置开发环境。
- Azure Active Directory 租户(租户 ID)。
- Azure 订阅。
- 将 Azure Sphere 公共 API 应用程序 ID 添加到 Azure 租户。
以下部分介绍如何使用托管标识从 Azure Web 应用调用 Azure Sphere 公共 API (PAPI)。
步骤 1:在资源中启用系统分配的标识
若要在资源中启用系统分配的标识,并查找项目的对象 ID:
- 在Azure 门户的左侧导航窗格中,单击App 服务。
- 从下拉列表中选择所需的订阅,并从搜索结果中选择应用。
- 在逻辑应用菜单的“设置”下,选择“标识” 。
- 通过将状态设置为“打开”来启用系统分配的标识。
- 单击“ 保存”。
- 复制对象 ID。
步骤 2:将托管标识添加到 Azure Sphere 租户
注意
在开始此步骤之前,请确保满足以下条件:
- Azure Sphere 租户:使用 Azure Sphere CLI 运行 azsphere tenant show-selected 命令。
- Azure 租户 ID:通过Azure 门户查找租户 ID。 复制 Azure Active Directory 租户 ID。
Azure Sphere 将服务主体视为其他用户。 若要使用服务主体获取令牌,请先将服务主体用户添加到 Azure Sphere 租户,然后使用 Azure Sphere CLI 将角色分配给 Azure Sphere 租户中的用户。
用户标识可以生成为 <ObjectID>@<TenantID.onmicrosoft.com>。
在以下示例中,我们使用 Azure Sphere 租户 ID 中的对象 ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
和 Azure AD 租户 tttttttt-tttt-tttt-tttt-tttttttttttt
ID zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz
的组合创建用户,然后为此用户添加参与者角色。
使用 Azure Sphere CLI 使用 Azure Sphere 登录:
azsphere login
选择所需的租户:
azsphere tenant select --tenant tttttttt-tttt-tttt-tttt-tttttttttttt
将用户添加到所需角色:
azsphere role add --role Contributor --user xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx@zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz.onmicrosoft.com
步骤 3:在项目中添加 Azure.Identity NuGet 包
在 项目中添加 Azure.Identity NuGet 包 。 Azure Sphere 公共 API (PAPI) 令牌可由 DefaultAzureCredential 获取。
有关示例,请参阅代码片段:
public static async Task<string> GetAS3Token()
{
DefaultAzureCredential credential = new DefaultAzureCredential();
var result = await credential.GetTokenAsync(new Azure.Core.TokenRequestContext(
new[] { "https://firstparty.sphere.azure.net/api/.default" }));
return result.Token;
}