Azure IoT Hub SAS令牌不会过期

时间:2017-02-20 13:13:27

标签: c# azure-iot-hub azure-iot-sdk

  • SDK: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));
    }
    

如果我错了,请纠正我,但这是否意味着开放式连接永不过期?这是谁的错?我会说IoT Hub应该在令牌到期时关闭连接,对吗?

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

1 个答案:

答案 0 :(得分:1)

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