可以使用 Microsoft Entra ID 来对 Azure IoT 中心 服务 API 的请求进行身份验证,例如“创建设备标识”和“调用直接方法”。 还可以使用Azure基于角色的访问控制(Azure RBAC)来授权这些相同的服务 API。 通过结合使用这些技术,您可以授予一个 Microsoft Entra 安全主体访问 IoT 中心 服务 API 的权限。 此安全主体可以是用户、组或应用程序服务主体。
通过使用 Microsoft Entra ID 进行访问身份验证,并通过使用 Azure RBAC 控制权限,可以提高安全性,并比安全令牌更易于使用。 为了最大程度地减少安全令牌中固有的潜在安全问题,我们建议尽可能强制实施 Microsoft Entra 身份验证。
注意
IoT 中心 设备 API(例如设备到云的消息和更新报告的属性)不支持使用 Microsoft Entra ID 进行身份验证。 使用 symmetric 密钥或 X.509对设备进行身份验证到 IoT 中心。
身份验证和授权
身份验证是证明你自己的身份的过程。 身份验证用于验证用户或设备的身份以连接到 IoT 中心。 身份验证有时缩写为 AuthN。
Authorization是确认IoT 中心上经过身份验证的用户或设备的权限的过程。 授权指定了你被允许访问的资源和命令,以及可以用这些资源和命令进行的操作。 授权有时缩写为 AuthZ。
当 Microsoft Entra 安全主体请求访问 IoT 中心 服务 API 时,主体首先身份验证。 要进行身份验证,请求需要在运行时包含 OAuth 2.0 访问令牌。 用于请求令牌的资源名称是 https://iothubs.chinacloudapi.cn。 如果应用程序在Azure资源(如 Azure VM、Azure Functions 应用或Azure 应用服务应用)中运行,则可以将其表示为 托管标识。
对Microsoft Entra主体进行身份验证后,下一步是 授权。 在此步骤中,IoT 中心使用Microsoft Entra角色分配服务来确定主体拥有哪些权限。 如果主体的权限与请求的资源或 API 匹配,IoT 中心授权请求。 因此,此步骤需要向安全主体分配一个或多个Azure角色。 IoT 中心提供一些具有常见权限组的内置角色。
使用 Azure RBAC 角色分配管理对IoT 中心的访问权限
使用 Microsoft Entra ID 和 RBAC,IoT 中心要求请求 API 的主体具有适当的授权权限级别。 若要为主体授予权限,需为该主体分配角色。
- 如果主体是用户、组或应用程序服务主体,请使用 Azure 门户按照 Assign Azure 角色中的指导进行操作。
- 如果主体是托管标识,请按照 将托管标识访问权限分配给Azure资源或其他资源中的指导。
为了确保最低特权,请始终在尽可能低的资源范围内分配适当的角色,这通常是IoT 中心范围。
IoT 中心提供以下Azure内置角色,用于使用 Microsoft Entra ID 和 RBAC 授权访问IoT 中心服务 API:
| 角色 | 说明 |
|---|---|
| IoT 中心数据参与者 | 允许完全访问IoT 中心数据平面操作。 |
| IoT 中心 数据读取者 | 允许对IoT 中心数据平面属性进行完全读取访问。 |
| IoT 中心 注册表参与者 | 允许完全访问IoT 中心设备注册表。 |
| IoT 中心孪生参与者 | 允许对所有IoT 中心设备和模块孪生进行读写访问。 |
还可以通过组合所需的 权限 来创建用于 IoT 中心 的自定义角色。 有关详细信息,请参阅Azure自定义角色。
资源范围
在向安全主体分配Azure RBAC 角色之前,请确定安全主体应具有的访问范围。 无论何时,最好都只授予最窄的可能范围。 Azure在更广泛的范围内定义的 RBAC 角色由它们下面的资源继承。
此列表描述从最窄的范围开始,可以限定对IoT 中心的访问权限的级别:
- IoT 中心。 在此范围,角色分配将应用于 IoT 中心。 没有比单个 IoT 中心更小的范围。 不支持在更小的范围(例如单个设备标识)内进行角色分配。
- 资源组。 在此范围,角色分配将应用于资源组中的所有 IoT 中心。
- 订阅。 在此范围,角色分配将应用于订阅中所有资源组内的所有 IoT 中心。
- 一个管理小组。 在此范围内,角色分配将应用于管理组中所有订阅的所有资源组内的所有 IoT 中心。
IoT 中心服务 API 的权限
下表描述了可用于IoT 中心服务 API 操作的权限。 要使客户端能够调用特定的操作,请确保该客户端的已分配 RBAC 角色为该操作提供足够的权限。
| RBAC 操作 | 说明 |
|---|---|
Microsoft.Devices/IotHubs/devices/read |
读取任何设备或模块标识。 |
Microsoft.Devices/IotHubs/devices/write |
创建或更新任何设备或模块标识。 |
Microsoft.Devices/IotHubs/devices/delete |
删除任何设备或模块标识。 |
Microsoft.Devices/IotHubs/twins/read |
读取任何设备或模块孪生。 |
Microsoft.Devices/IotHubs/twins/write |
写入任何设备或模块孪生。 |
Microsoft.Devices/IotHubs/jobs/read |
返回作业列表。 |
Microsoft.Devices/IotHubs/jobs/write |
创建或更新任何任务。 |
Microsoft.Devices/IotHubs/jobs/delete |
删除任何作业。 |
Microsoft.Devices/IotHubs/cloudToDeviceMessages/send/action |
向任何设备发送面向设备的云消息。 |
Microsoft.Devices/IotHubs/cloudToDeviceMessages/feedback/action |
接收、完成或丢弃云到设备的消息反馈通知。 |
Microsoft.Devices/IotHubs/cloudToDeviceMessages/queue/purge/action |
删除设备的所有挂起命令。 |
Microsoft.Devices/IotHubs/directMethods/invoke/action |
在任何设备或模块上调用直接方法。 |
Microsoft.Devices/IotHubs/fileUpload/notifications/action |
接收、完成或丢弃文件上传通知。 |
Microsoft.Devices/IotHubs/statistics/read |
读取设备和服务统计信息。 |
Microsoft.Devices/IotHubs/configurations/read |
读取设备管理配置。 |
Microsoft.Devices/IotHubs/configurations/write |
创建或更新设备管理配置。 |
Microsoft.Devices/IotHubs/configurations/delete |
删除任何设备管理配置。 |
Microsoft.Devices/IotHubs/configurations/applyToEdgeDevice/action |
将配置内容应用于边缘设备。 |
Microsoft.Devices/IotHubs/configurations/testQueries/action |
验证配置的目标条件和自定义指标查询。 |
提示
-
Update Registry 操作需要
Microsoft.Devices/IotHubs/devices/write和Microsoft.Devices/IotHubs/devices/delete。 -
Get Twins 操作需要
Microsoft.Devices/IotHubs/twins/read。 -
Get Digital Twin 需要
Microsoft.Devices/IotHubs/twins/read。 更新数字孪生需要Microsoft.Devices/IotHubs/twins/write。 -
Invoke 组件命令和Invoke 根级命令都需要
Microsoft.Devices/IotHubs/directMethods/invoke/action。
注意
若要使用 Microsoft Entra ID 从IoT 中心获取数据,将路由设置为自定义事件中心终结点。 若要访问 内置的事件中心兼容终结点,请使用与以前一样连接字符串(共享访问密钥)方法。
强制实施Microsoft Entra身份验证
默认情况下,IoT 中心通过 Microsoft Entra ID 和 共享访问策略和安全令牌支持服务 API 访问。 若要最大程度地减少安全令牌中固有的潜在安全漏洞,可以禁止使用共享访问策略进行访问。
警告
通过拒绝使用共享访问策略的连接,使用此方法进行连接的所有用户和服务将立即失去访问权限。 值得注意的是,由于设备预配服务(DPS)仅支持使用共享访问策略链接 IoT 中心,所有设备预配流都失败,并出现“未授权”错误。 请仔细操作,并计划将访问权限替换为Microsoft Entra基于角色的访问。
如果使用设备预配服务,请不要继续操作。
登录到 Azure 门户并导航到 IoT 中心。
从导航菜单的“安全设置”部分选择“共享访问策略”。
在“使用共享访问策略连接”下,选择“拒绝”,然后查看警告。
选择“保存”。
现在只能通过 Microsoft Entra ID 和 RBAC 访问IoT 中心服务 API。
在 Azure 门户中访问 Microsoft Entra ID
可以使用共享访问策略或Microsoft Entra权限从Azure门户提供对IoT 中心的访问权限。
尝试从 Azure 门户访问 IoT 中心 时,Azure 门户会首先检查您是否被分配了一个具有 Microsoft.Devices/iotHubs/listkeys/action 的 Azure 角色。 如果有,Azure门户使用共享访问策略中的密钥来访问IoT 中心。 如果条件不满足,Azure 门户将尝试通过您的 Microsoft Entra 帐户访问数据。
若要使用 Microsoft Entra 帐户从 Azure 门户访问IoT 中心,需要有权访问IoT 中心数据资源(如设备和孪生)。 还需要权限才能转到Azure门户中的IoT 中心资源。 IoT 中心提供的内置角色授予对设备和孪生等资源的访问权限,但不会授予对IoT 中心资源的访问权限。 因此,访问门户还需要分配 Azure 资源管理器角色,例如 Reader。 读取者角色是一种不错的选择,因为它是允许在门户中导航的最受限制的角色。 它不包括 Microsoft.Devices/iotHubs/listkeys/action 权限(通过共享访问策略提供对所有IoT 中心数据资源的访问权限)。
若要确保帐户在分配的权限之外没有访问权限,请在创建自定义角色时不包括 Microsoft.Devices/iotHubs/listkeys/action 权限。 例如,若要创建一个可以读取设备标识但不能创建或删除设备的自定义角色,请创建符合以下要求的自定义角色:
- 具有
Microsoft.Devices/IotHubs/devices/read数据操作。 - 没有
Microsoft.Devices/IotHubs/devices/write数据操作项。 - 没有
Microsoft.Devices/IotHubs/devices/delete数据操作。 - 没有
Microsoft.Devices/iotHubs/listkeys/action功能。
然后,请确保帐户没有具有 Microsoft.Devices/iotHubs/listkeys/action 权限的任何其他角色,例如 Owner 或 Contributor。 要使该帐户拥有资源访问权限并可以在门户中导航,请分配读取者角色。
通过Azure CLI访问Microsoft Entra ID
针对IoT 中心的大多数命令都支持Microsoft Entra身份验证。 可以使用 --auth-type 参数(接受 key 或 login 值)来控制用于运行命令的身份验证类型。
key 值为默认值。
--auth-type具备key值时,CLI 会在与 IoT 中心 交互时,自动发现合适的策略。当
--auth-type拥有login值时,将使用来自登录主体的 Azure CLI 访问令牌来进行操作。
有关详细信息,请参阅 Azure CLI 发布页的 Azure IoT 扩展。
SDK 示例
后续步骤
- 有关在应用程序中使用 Microsoft Entra ID 的优势的更多信息,请参阅 与 Microsoft 身份平台的集成。
- 若要了解如何在授权和身份验证中使用访问令牌、刷新令牌和 ID 令牌,请参阅 令牌和声明概述。