Azure IoT 中心 SAS 令牌不会过期

Posted

技术标签:

【中文标题】Azure IoT 中心 SAS 令牌不会过期【英文标题】:Azure IoT Hub SAS Token doesn't expire 【发布时间】:2017-07-09 18:56:36 【问题描述】: 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));

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

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

【问题讨论】:

这是一个已经报过的bug——目前如果你使用MQTT,设备连接时会检查token,但是token过期时IoT Hub不会断开设备。 好的,谢谢。你能提供一个问题的链接吗?所以你的意思是在使用例如AMQP你没有这个问题吗? 我没有指向该问题的公共链接。我刚刚尝试使用 AMQP 并在 SAS 过期时出现授权错误,HTTP 也是如此。所以这个问题目前只存在于 MQTT 协议中。 包版本 Microsoft.Azure.Devices.Client 1.5.0 的错误仍然存​​在。这是错误的 URL:github.com/Azure/azure-iot-sdk-c/issues/163 谢谢! 【参考方案1】:

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

【讨论】:

以上是关于Azure IoT 中心 SAS 令牌不会过期的主要内容,如果未能解决你的问题,请参考以下文章

Blob 存储帐户的 Azure SAS 令牌不起作用

音频文件的 Azure SAS 到期

如何测试 Azure AD 访问令牌过期

带有 AdlsClient 的 Azure MSI:访问令牌已过期

Azure 事件中心 python 中 SAS 令牌的连接字符串

如何配置 Azure AD 访问令牌的过期时间(使用 ADAL)?