2017-08-16 155 views
1

我使用Azure IoT集线器将文件从Raspberry Pi上传到Azure Blob存储,使用this microsoft tutorial作为我的C#代码的基础,并且工作正常。使用IoT Hub将文件上传到Azure BLOB - 权限

查看有关方法的Microsoft文档UploadToBlobAsync()“如果blob已经存在,它将被覆盖。”

我想知道是否有任何方法来限制设备的权限,以在Azure门户或通过PowerShell创建。我担心的是,如果有人访问设备的存储并获取设备ID和密钥,他们将有办法删除或覆盖此设备先前在存储容器中上传的文件。

作为一个解决方案我可能有一个服务器端进程接收文件,一旦他们已收到并将他们移动到其他地方,但如果设备ID /键被限制为只创建那么我wouldn'吨需要这个开销。

回答

0

方法UploadToBlobAsync(程序集Microsoft.Azure.Devices.Client.UWP)是将blob上传到Azure存储容器的REST API序列调用的包装。 以下序列进行处理:

  1. REST API调用天青的IoT集线器以获得参考上传团块,请参阅下列屏幕片段:

ReferenceUploadFile

正如你可以看到在上面的图片中,对于该操作的sasToken已经被生成用于读取/写入。

  1. 设备收到上述响应后,可以调用REST API PUT blob。 这是我的建议。该装置可以调用REST API获取斑点的元数据,请参见以下屏幕片段:

UploadFile-GET

基于上述结果,该序列可以是跳过或继续使用该实际上传团块REST API PUT。

  1. 这是序列的最后一步(非常重要)。设备需要以上传顺序的状态向Azure IoT Hub发送通知。下面的屏幕片段显示了这个REST API调用:

NotifyUploadFile

那么,你可以看到上面的步骤#2可以决定对跳跃或覆盖上传斑点处理。

+0

感谢UploadToBlobAsync()方法的详细分解。如果我理解正确,客户端会向Azure拨打一个共享访问令牌,然后用它来上传文件。既然如此,为了防止BLOB被覆盖,我需要一种方法来防止步骤1发出一个令牌,如果BLOB已经存在于存储器中的话。正确? – Pete

+0

Step1是向Azure IoT Hub发送启动AMQP状态机以上传进程通知的设备请求。每个设备可以同时拥有最多10个状态机。上传过程(状态机)的完成是通过步骤3或到期TTL时间(48小时)完成的。换句话说,必须调用步骤1和步骤3。步骤2是可选的,在此步骤中设备可以检查文件是否已经存在。基于步骤2的结果,可以在步骤3中发送通知状态以用于通知后端逻辑。 –

+0

这里的问题是,我并不关心我自己的应用程序是否覆盖BLOB容器中的文件,但其他人如果从我的设备上的存储设备中获取设备ID和密钥,则会这样做。因此,任何解决方案都需要在Azure门户中配置,而不是在应用程序代码中配置。 – Pete