401003 IoTHubUnauthorized

本文介绍了 401003 IoTHubUnauthorized 错误的原因和解决方案。

症状

症状 1

在日志中,你会看到这样一种情况:设备断开连接并出现“401003 IoTHubUnauthorized”,接着出现“404104 DeviceConnectionClosedRemotely”,然后在不久之后成功连接 。

症状 2

对 IoT 中心的请求失败,并出现以下错误消息之一:

  • 缺少 Authorization 标头
  • IotHub '*' 未包含指定的设备 '*'
  • 授权规则 '*' 不允许访问 '*'
  • 此设备的身份验证失败,请续订令牌或证书,然后重新连接
  • 指纹与配置不匹配:指纹:SHA1Hash=*, SHA2Hash=*;配置:PrimaryThumbprint=*, SecondaryThumbprint=*
  • 由于未分配权限,主体 user@example.com 无权对 /exampleOperation 执行 GET 操作

原因

原因 1

对于 MQTT,某些 SDK 依赖于 IoT 中心在 SAS 令牌过期时发出断开连接的指令,以便知道何时刷新它。 因此,

  1. SAS 令牌过期
  2. IoT 中心会注意到过期,将设备断开连接并显示 401003 IoTHubUnauthorized
  3. 设备完成断开连接并显示 404104 DeviceConnectionClosedRemotely
  4. IoT SDK 生成一个新的 SAS 令牌
  5. 设备成功重新连接到 IoT 中心

原因 2

IoT 中心无法对 auth 标头、规则或密钥进行身份验证。 这可能是由于症状中提到的任何原因所致。

解决方案

解决方案 1

如果使用 IoT SDK 通过设备连接字符串进行连接,则不需要执行任何操作。 IoT SDK 会重新生成新令牌,以在 SAS 令牌过期时重新连接。

SDK 的默认令牌有效期为 60 分钟;但是,对于某些 SDK,令牌有效期和令牌续订阈值是可配置的。 此外,设备在令牌续订时断开连接并重新连接时生成的错误对于每个 SDK 都是不同的。 若要了解更多信息,并了解如何确定设备在日志中使用哪个 SDK,请参阅 Azure IoT SDK 的 MQTT 设备断开连接行为

对于设备开发人员,如果担心错误数量太多,请切换到 C SDK,这会在 SAS 令牌过期之前续订它。 对于 AMQP,SAS 令牌可以在不断开连接的情况下进行刷新。

解决方案 2

通常情况下,出现的错误消息应说明如何修复此错误。 如果由于某种原因无法访问错误消息详细信息,请确保:

  • 所用的 SAS 或其他安全令牌未过期。
  • 对于 X.509 证书身份验证,设备证书或与设备关联的 CA 证书未过期。 若要了解如何将 X.509 CA 证书注册到 IoT 中心,请参阅在 Azure IoT 中心设置 X.509 安全性
  • 对于 X.509 证书指纹身份验证,需要向 IoT 中心注册设备证书的指纹。
  • 授权凭据的格式正确,适用于所使用的协议。 若要了解详细信息,请参阅控制 IoT 中心的访问权限
  • 使用的授权规则对所请求的操作具有权限。
  • 对于以“主体...”开头的最后一条错误消息,可以通过向用户分配正确的 Azure RBAC 权限级别来解决此错误。 例如,IoT 中心的所有者可以分配提供所有权限的“IoT 中心数据所有者”角色。 尝试使用此角色来解决缺少权限的问题。

后续步骤