1
  • 开发工具包:C#
  • 版本:Microsoft.Azure.Devices.Client 1.2.3
  • 错误重现代码:
    让以下运行 15 分钟左右*,您会看到发送仍然成功,尽管令牌应该已经过期。

    var hostName = ...
    var deviceId = ...
    var sasToken = new SharedAccessSignatureBuilder
        {
            Key = sharedAccessKey,
            Target = $"{hostName}/devices/{deviceId}",
            TimeToLive = TimeSpan.FromMinutes(5)
        }
        .ToSignature();
    
    var authenticationMethod = new DeviceAuthenticationWithToken(deviceId, sasToken);
    var connectionString = IotHubConnectionStringBuilder
        .Create(hostName, authenticationMethod)
        .ToString();
    var deviceClient = DeviceClient
        .CreateFromConnectionString(connectionString, TransportType.Mqtt);
    
    while (true)
    {
        Console.WriteLine($"{DateTime.UtcNow}: Sending");
        var messageContent = Encoding.UTF8.GetBytes("{}");
        var message = new Message(messageContent);
        await deviceClient.SendEventAsync(message);
        await Task.Delay(TimeSpan.FromSeconds(10));
    }
    

如果我错了,请纠正我,但这是否意味着打开的连接永远不会过期?这是谁的错?我会说物联网中心应该在令牌过期时关闭连接,对吗?

* 在内部,令牌似乎再有效五分钟,因为这就是他们定义为MaxClockSkew. 因此,为了节省一些时间,您可以设置SharedAccessSignatureBuilder.TimeToLive为 -4.9 分钟,令牌应在 0.1 分钟内过期。

4

1 回答 1

1

这是一个已经报告的错误 - 目前如果您使用 MQTT,则在设备连接时会检查令牌,但当令牌过期时,IoT Hub 不会断开设备连接。我没有指向该问题的公共链接。我刚刚尝试使用 AMQP 并在 SAS 过期时出现授权错误,HTTP 也是如此。所以这个问题目前只存在于 MQTT 协议。

于 2017-02-27T06:34:24.017 回答