【问题标题】:cosmos db, generate authentication key on client for Azure Table endpointcosmos db,在客户端上为 Azure Table 端点生成身份验证密钥
【发布时间】:2018-01-11 05:11:39
【问题描述】:

Cosmos DB、API Azure Tables 在概览边栏选项卡中为您提供 2 个端点

  • 文档端点
  • Azure 表端点

(1)的一个例子是

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

(2)的一个例子是

https://myname.table.cosmosdb.azure.com/FirstTestTable?$filter=PartitionKey%20eq%20'car'%20and%20RowKey%20eq%20'124'

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

这会给你这样的代码:

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

这对于玩其他 url 很有用

对于 (2),我能找到生成有效代码的唯一代码是在服务器端,并为您提供如下代码:

授权:SharedKey myname:JXkSGZlcB1gX8Mjuu...

我必须从 Fiddler 那里得到这个

我的问题

(i) 您能否像为案例 (1) 一样在客户端生成上述案例 (2) 的代码

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

【问题讨论】:

    标签: azure-cosmosdb


    【解决方案1】:

    如果您访问 GA 表 API 帐户的 Azure 门户,您将不会再看到文档端点。而是仅公布 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 中。确保您阅读了专门针对表服务的部分。需要注意的是 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 表 API 帐户粘贴连接字符串,然后单击下一步,然后在下一个对话框中单击连接
    3. 在左侧的资源管理器窗格中,在“存储帐户”下查找您的帐户(不是 Cosmos DB 帐户(预览版)),然后单击表,然后右键单击要探索的特定表。在右键单击对话框中,您将看到“获取共享访问签名”条目,单击该条目。
    4. 将显示一个名为“生成共享访问签名”的新对话框。不幸的是,一个抱怨“NotImplemented”的错误对话框也会如此,你可以忽略它。只需在错误对话框中单击“确定”即可。
    5. 现在您可以选择如何配置您的 SAS,我通常只使用默认值,因为这样可以提供最广泛的访问权限。现在点击创建。

    结果将是一个包含完整 URL 和查询字符串的对话框。

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

    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 令牌。

    【讨论】:

    • “GA 表”?什么是GA?如果您创建了 Cosmos DB 帐户、Table API,那么您肯定会在概览中看到一个文档端点,我刚刚尝试过。谢谢你的详细回复,我会尽快处理的
    • 抱歉,GA 的意思是“一般可用性”,而不是“预览表”。去年 11 月,我们将 Table API 从预览版升级到了我们所说的“GA”,这意味着它现在是一个完全支持的功能,可用于生产环境。顺便说一句,我确认你是对的。我们仍在宣传我们不应该为表格做的文档端点。请使用 Azure 表端点。如果您查看连接字符串刀片,您将看到表端点是列出的端点。
    • @YaronY.Goland 我正在尝试使用 continuationtoken-nextpartitionkey 和 continuationtoken-rowkey 在初始调用后获取更多行,但是当我这样做时它给了我 400 BadRequest
    猜你喜欢
    • 2017-10-24
    • 1970-01-01
    • 2014-07-31
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2021-10-29
    相关资源
    最近更新 更多