验证基于Azure Table SAS的凭据

时间:2016-12-06 15:28:06

标签: java azure azure-storage azure-table-storage

我正在寻找使用Azure存储Java SDK验证使用SAS的任意Azure Table连接字符串的简单方法:

https://example.table.core.windows.net/example?sig=aaabbbcccdddeeefffggghhh%3D&se=2020-01-01T00%3A00%3A00Z&sv=2015-04-05&tn=example&sp=raud

我尝试了CloudTable api暴露的一堆不同方法,但没有一种方法有效。

    无论凭据是否有效,
  • CloudTable.exists()都会抛出StorageException

  • getName()getStorageUri()getUri()和其他getter - 无论凭据如何都在本地工作

  • getServiceClient().downloadServiceProperties()getServiceClient().getServiceStats()也会抛出各种异常,而getServiceClient().getEndpoint()getServiceClient().getCredentials()以及其他人总是在本地工作。

  • 为什么我不只是在表中查询一行或两行?好吧,在很多情况下,我需要验证一个只提供写入或更新权限的SAS(没有deleteread权限),而且我不想执行一个只更改表中某些内容的语句检查凭据。

1 个答案:

答案 0 :(得分:2)

回答你的问题:

  

CloudTable.exists()抛出StorageException,无论是否   凭证有效

我认为在将此方法与SAS令牌一起使用时,SDK存在一个错误。我记得有一段时间回到同一个问题。

  

getName(),getStorageUri(),getUri()和其他getter - 所有工作   本地,无论凭证如何

这些将起作用,因为他们不进行网络呼叫。他们只是在不同的实例变量中使用他们可用的数据并返回数据。

  

getServiceClient()。downloadServiceProperties()和   getServiceClient()。getServiceStats()也抛出各种异常,   而getServiceClient()。getEndpoint()和   getServiceClient()。getCredentials()和其他人总是在本地工作。

为了getServiceClient().someMethod()使用SAS,您需要Account SAS而不是Service SAS(您现在正在使用)。

  

为什么我不只是在表中查询一行或两行?嗯,在很多情况下   我需要验证只提供写入或更新预留的SAS   (没有删除或读取权限),我不想执行   声明改变表中的内容只是为了检查   凭证。

检查SAS令牌执行写入操作的有效性的一种可能方法是执行写入操作,您知道该操作会因错误而失败。例如,您可以尝试插入已存在的实体。在这种情况下,您应该收到Conflict (409)错误。您可以尝试执行的其他操作是通过指定一些随机Etag值来执行乐观写入,并检查Precondition Failed (412)错误。如果您收到403错误或404错误,则表示您的SAS令牌有问题。