首页 文章

未强制使用ResourcePartitionKey的CosmosDB UserPermission

提问于
浏览
0

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

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

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

该系列是全新的Unlimited,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'的值不正确但我无法确定是什么 . 任何想法都非常感激 .

1 回答

  • 1

    经过多个小时的反复试验,我终于解决了在POST创建用户权限期间导致的问题 .

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

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

    下面是一个完整的工作示例,其中权限ID称为“读取集合”,而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"
    }
    

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

相关问题