0

我正在尝试使用对用户权限的附加 ResourcePartitionKey 限制来实现此CosmosDB 文档中描述的行为,以将资源令牌限制为仅访问属于指定分区键的文档,但是我无法使其工作。

使用 SQL REST API,我在使用 resourcepartitionkey 密钥对创建 UserPermission 对象的 POST 中没有收到任何错误,并且初始返回的对象以及后续 GET 也显示在获取资源令牌时存在的“resourcepartitionkey”。

针对权限中指定的适当集合使用资源令牌,我可以列出集合中的所有文档。当使用“x-ms-documentdb-partitionkey”标头时,我可以定位任何我喜欢的分区键。如果没有“x-ms-documentdb-partitionkey”标头,它只会返回整个集合。

该集合是一个全新的、无限制的 1000 RU,分区键为“/rpk”。集合的创建后查询显示分区键配置如下

"partitionKey": {
    "paths": [
        "\/rpk"
    ],
    "kind": "Hash"
} 

以下是创建期间返回的用户权限,显示“resourcepartitionkey”存在

{
    "resource": "dbs/dbName/colls/collectionName/",
    "id": "read-collection",
    "resourcepartitionkey": "rpk1",
    "permissionMode": "read",
    "_rid": "lH9FACGGKwAhslfihB0pAA==",
    "_self": "dbs\/lH9FAA==\/users\/lH9FACGGKwA=\/permissions\/lH9FACGGKwAhslfihB0pAA==\/",
    "_etag": "\"0000ba07-0000-0000-0000-5b7418770000\"",
    "_ts": 1534335095,
    "_token": "type=resource&ver=1&sig=<resource token signature>"
}

以下是使用上述资源令牌的文档请求。我希望这会失败,因为针对分区集合缺少“x-ms-documentdb-partitionkey”标头,但它都成功并继续从集合中的所有分区键返回记录(我的测试数据集中只有 2 个)

GET https://accountname.documents.azure.com/dbs/dbName/colls/collectionName/docs HTTP/1.1
authorization: type%3dresource%26ver%3d1%26sig<resource token signature>
x-ms-version: 2017-02-22
x-ms-max-item-count: -1
x-ms-date: Wed, 15 Aug 2018 12:11:35 GMT
User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-AU) WindowsPowerShell/5.1.17134.165
Content-Type: application/json
Host: accountname.documents.azure.com

来自上述请求的响应正文显示来自分区键 rpk1 和 rpk2 的文档,即使用户权限配置为 rpk1。

{
    "_rid": "lH9FAKbDh4c=",
    "Documents": [
        {
            "id": "blue",
            "rpk": "rpk1",
            "_rid": "lH9FAKbDh4cCAAAAAAAAAA==",
            "_self": "dbs\/lH9FAA==\/colls\/lH9FAKbDh4c=\/docs\/lH9FAKbDh4cCAAAAAAAAAA==\/",
            "_etag": "\"ec012ca1-0000-0000-0000-5b73ab440000\"",
            "_attachments": "attachments\/",
            "_ts": 1534307140
        },
        {
            "id": "red",
            "rpk": "rpk2",
            "_rid": "lH9FAKbDh4cDAAAAAAAAAA==",
            "_self": "dbs\/lH9FAA==\/colls\/lH9FAKbDh4c=\/docs\/lH9FAKbDh4cDAAAAAAAAAA==\/",
            "_etag": "\"ec012da1-0000-0000-0000-5b73ab580000\"",
            "_attachments": "attachments\/",
            "_ts": 1534307160
        }
    ],
    "_count": 2
}

我假设我错过了一些明显的东西,或者在 UserPermission 中为“resourcepartitionkey”使用了不正确的值,但我无法确定是什么。任何想法都非常感谢。

4

1 回答 1

1

经过更多小时的反复试验,我终于解决了在 POST 创建用户权限期间引起的问题。

首先,虽然创建用户权限将验证名称“resourcePartitionKey”,但它不检查区分大小写。由于敏感度不正确,返回的 UserPermission 对象的值存在但不提供任何安全控制(危险情况 #1)

其次,未验证输入值是否为数组类型。它再次被接受并在用户权限对象中返回给您,但再次不提供安全控制(危险情况#2)

下面是一个完整的工作示例,其中权限 ID 称为“read-collection”,resourcePartitionKey 配置为“rpk1”,最终表现出要求“x-ms-documentdb-partitionkey”请求的预期行为,并且只返回来自指定的分区键。

POST https://accountname.documents.azure.com/dbs/dbName/users/userName/permissions HTTP/1.1
authorization: type%3dmaster%26ver%3d1.0%26sig<signature>
x-ms-version: 2017-02-22
x-ms-date: Thu, 16 Aug 2018 04:09:44 GMT
User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-AU) WindowsPowerShell/5.1.17134.165
Content-Type: application/json
Host: accountname.documents.azure.com
Content-Length: 215

{
    "resource":  "dbs/dbName/colls/collectionName/",
    "id":  "read-collection",
    "resourcePartitionKey":  [
                                 "rpk1"
                             ],
    "permissionMode":  "read"
} 

如果有人知道在哪里记录 CosmosDB SQL Rest API 的 DCR 或错误,请告诉我,因为在创建资源权限期间没有适当的验证,资源令牌可能会分发给低信任客户端,这些客户端可以获得对集合数据的意外完全访问权限。

于 2018-08-16T05:05:31.213 回答