Azure IoT 中心 SAS 令牌不会过期
Azure IoT Hub SAS Token doesn't expire
- SDK:C#
- 版本:Microsoft.Azure.Devices.Client1.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 分钟内过期。
这是一个已经报告过的错误 - 目前,如果您使用 MQTT,设备连接时会检查令牌,但当令牌过期时,IoT 中心不会断开设备连接。
我没有 public link 问题。我刚刚尝试使用 AMQP 并在 SAS 过期时收到授权错误,HTTP 也会发生同样的情况。所以目前只有MQTT协议存在这个问题
- SDK:C#
- 版本:Microsoft.Azure.Devices.Client1.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 分钟内过期。
这是一个已经报告过的错误 - 目前,如果您使用 MQTT,设备连接时会检查令牌,但当令牌过期时,IoT 中心不会断开设备连接。 我没有 public link 问题。我刚刚尝试使用 AMQP 并在 SAS 过期时收到授权错误,HTTP 也会发生同样的情况。所以目前只有MQTT协议存在这个问题