cosmos db,在Azure Table端点上为客户端生成身份验证密钥

时间:2017-12-30 14:37:22

标签: azure-cosmosdb

Cosmos DB,API Azure Tables,在概述刀片中为您提供了2个端点

  • 文档端点
  • Azure表端点

(1)的一个例子是

https://myname.documents.azure.com/dbs/tempdb/colls

(2)的一个例子是

https://myname.table.cosmosdb.azure.com/FirstTestTable?$滤波器= PartitionKey%20当量%20'car '%20于是%20RowKey%20当量%20'124'

您可以使用此邮递员脚本中的预先申请代码在客户端上为(1)创建授权代码:https://github.com/MicrosoftCSA/documentdb-postman-collection/blob/master/DocumentDB.postman_collection.json

这会给你一个像这样的代码:

授权:输入%3Dmaster%26ver%3D1.0%26sig%3DavFQkBscU ...

这对于玩其余网址非常有用

对于(2)我能找到的唯一代码来生成一个可以在服务器端运行的代码并给你一个这样的代码:

授权:SharedKey myname:JXkSGZlcB1gX8Mjuu ...

我必须从Fiddler那里得到这个

我的问题

(i)您是否可以在客户端上为案例(2)生成代码,就像案例(1)

一样

(ii)您能否安全地从客户端使用Cosmos DB?

1 个答案:

答案 0 :(得分:1)

如果您访问Azure门户以获取GA Table API帐户,您将无法再看到文档端点。而是仅公布Azure表端点(例如,X.table.cosmosdb.azure.com)。所以我们将重点放在那上面。

当使用除.NET SDK的直接模式以外的任何东西时,我们现有的SDK在与X.table.cosmosdb.azure.com端点通信时都使用SharedKey身份验证方案。还有一个SharedKeyLight方案也应该有效。两者都记录在https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services中。请务必阅读Table Service上的相关章节。需要注意的是,SharedKey标头直接与其关联的请求相关联。所以基本上每个请求都需要一个唯一的头这对安全性很有用,因为这意味着泄漏的标头只能在有限的时间内用于重放特定的请求。它不能用于授权其他请求。但当然这正是你想要做的事情。

另一种选择是SharedKeyLight标头,它更容易实现,因为它只需要一个日期和一个URL。

但是我们没有外部化的代码库来真正帮助它们。

但是还有另一种解决方案对Fiddler或Postman这样的事情非常友好,即使用https://blogs.msdn.microsoft.com/windowsazurestorage/2012/06/12/introducing-table-sas-shared-access-signature-queue-sas-and-update-to-blob-sas/中定义的SAS URL。

至少有两种获取SAS令牌的方法。一种方法是自己生成一个。以下是一些示例代码:

        var connectionString = "DefaultEndpointsProtocol=https;AccountName=tableaccount;AccountKey=X;TableEndpoint=https://tableaccount.table.cosmosdb.azure.com:443/;";
        var tableName = "ATable";

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
        CloudTable table = tableClient.GetTableReference(tableName);
        await table.CreateIfNotExistsAsync();

        SharedAccessTablePolicy policy = new SharedAccessTablePolicy()
        {
            SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1000),
            Permissions = SharedAccessTablePermissions.Add
            | SharedAccessTablePermissions.Query
            | SharedAccessTablePermissions.Update
            | SharedAccessTablePermissions.Delete
        };

        string sasToken = table.GetSharedAccessSignature(
            policy, null, null, null, null, null);

这将返回创建SAS URL所需的URL的查询部分。

获取SAS URL的另一种无代码方式是转到https://azure.microsoft.com/en-us/features/storage-explorer/并下载Azure存储资源管理器。当您启动它时,它将显示"连接到Azure存储"对话。在那种情况下:

  1. 选择"使用连接字符串或共享访问签名URI"然后单击“下一步”
  2. 选择"使用连接字符串"并从Azure门户中为您的Azure Cosmos DB Table API帐户粘贴连接字符串,然后单击“下一步”,然后在下一个对话框中单击“连接”
  3. 在左侧的资源管理器窗格中,在"存储帐户"下查找您的帐户。 (不是Cosmos DB Accounts(预览))然后单击Tables,然后右键单击要探索的特定表。在右键单击对话框中,您将看到"获取共享访问签名"的条目,单击该条目。
  4. 一个名为"生成共享访问签名的新对话框"会出现。不幸的是,错误对话框抱怨" NotImplemented",你可以忽略它。只需在错误对话框中单击“确定”即可。
  5. 现在您可以选择如何配置SAS,我通常只选择默认值,因为它提供了最广泛的访问权限。现在单击“创建”。
  6. 结果将是一个包含完整URL和查询字符串的对话框。

    所以现在我们可以获取该URL(或者使用代码中的查询输出自己创建它)并创建一个fiddler请求:

    GET https://tableaccount.table.cosmosdb.azure.com/ATable?se=2018-01-12T05%3A22%3A00Z&sp=raud&sv=2017-04-17&tn=atable&sig=X&$filter=PartitionKey%20eq%20'Foo'%20and%20RowKey%20eq%20'bar' HTTP/1.1
    User-Agent: Fiddler
    Host: tableaccount.table.cosmosdb.azure.com
    Accept: application/json;odata=nometadata
    DataServiceVersion: 3.0
    

    为了使请求更有趣,我添加了$ filter操作。这是一个OData过滤器,可让我们探索内容。注意,顺便说一句,要使过滤器工作,需要Accept和DataServiceVersion标头。但是您可以使用基本URL(例如,没有filter参数)在特定表上进行任何REST API调用。

    请注意,SAS令牌的范围限定为单个表。因此,更高级别的操作无法使用此SAS令牌。