如何使用资源标记初始化.NET API中的DocumentClient

时间:2018-03-11 21:45:30

标签: permissions azure-cosmosdb

我创建了一个创建用户和权限的中间件,并按照this article中的描述为我的客户端提供令牌。

但是,我没有成功使用令牌连接到我的azure数据库。我已经尝试使用令牌作为普通String和完全IList<Permission>用户在相应DocumentClient constructors中的权限。

以下是我的用户权限:

{
    "_rid": "vPAMAAVaBgA=",
    "Permissions": [
        {
            "permissionMode": "All",
            "resource": "dbs/vPAMAA==/colls/vPAMAO7LQQA=/",
            "id": "service.dataPK",
            "_rid": "vPAMAAVaBgBk3LOBwSFjAA==",
            "_self": "dbs/vPAMAA==/users/vPAMAAVaBgA=/permissions/vPAMAAVaBgBk3LOBwSFjAA==/",
            "_etag": "\"00001c00-0000-0000-0000-5aa58bba0000\"",
            "_ts": 1520798650,
            "_token": "type=resource&ver=1&sig=6Dr2xKx660ZVcCO2mBbigQ==;Pl2S/djma1b8CjrmBeiIKzu4bhUgXLzaf9heZeK2UjAPihO9PfGLItQYLMt64TROG5b9H974WHhdT4L8oDREdpjA674MY/dMBqoT3AI7GkfKU/5/+HurJGRAHnwUoHlxjvasO7vsWtLln1tWlQlZSypcmF/Qey8QM+PIdJVsBWxDr2tJLW5GXCZ5BO3cFTP28qjOJ54wY7H2rxb9tqPywfnEWd27E7WtWlbqeoaOPTJX7yjFdmaaULOgIIHXq8dJ;"
        }
    ],
    "_count": 1
}

我在_token构造函数中使用DocumentClient这是正确的吗? 这是我想要访问的集合:

{
    "id": "service.data",
    "indexingPolicy": {
        "indexingMode": "consistent",
        "automatic": true,
        "includedPaths": [
            {
                "path": "/*",
                "indexes": [
                    {
                        "kind": "Range",
                        "dataType": "Number",
                        "precision": -1
                    },
                    {
                        "kind": "Range",
                        "dataType": "String",
                        "precision": -1
                    },
                    {
                        "kind": "Spatial",
                        "dataType": "Point"
                    }
                ]
            }
        ],
        "excludedPaths": [
            {
                "path": "/'_OLD'/*"
            }
        ]
    },
    "_rid": "vPAMAO7LQQA=",
    "_ts": 1518383426,
    "_self": "dbs/vPAMAA==/colls/vPAMAO7LQQA=/",
    "_etag": "\"00001f11-0000-0000-0000-5a80b1420000\"",
    "_docs": "docs/",
    "_sprocs": "sprocs/",
    "_triggers": "triggers/",
    "_udfs": "udfs/",
    "_conflicts": "conflicts/"
}

我是否必须在Endpoint-URI中反映正确的数据库和/或集合?

当我使用令牌时,我得到了异常

Unauthorized, The input authorization token can't serve the request

当我尝试使用(非null)PermissionFeed时,Constructor会抛出

System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei Microsoft.Azure.Documents.AuthorizationHelper.IsResourceToken(String token)
bei Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, IList`1 resourceTokens, ConnectionPolicy connectionPolicy, Nullable`1 desiredConsistencyLevel)
bei Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, IList`1 permissionFeed, ConnectionPolicy connectionPolicy, Nullable`1 desiredConsistencyLevel)

我一直在咀嚼这两天没有运气。其他所有事情都是在使用Cosmos DB的公园散步,但这让我感到疯狂,因为我似乎无法找到AuthToken与.NET API一起使用的任何示例。

服务器的时区与客户端不同(我正在运行正在开发的中间件) - 但这可能不是问题,对吧?我使用UTCNow比较示例中的到期时间,但创建权限完全取决于Cosmos DB ...?

1 个答案:

答案 0 :(得分:0)

原来我使用了错误的构造函数。

当我开始开发时,我使用的是DocumentClient构造函数,它将(master-)键作为SecureString。然后我只是插入当前接口中的令牌(特别是一个名为SetAuthKey(string plainTextKey)的方法),并在内部调用 - 在这种情况下是错误的 - 构造函数。

使用正确的构造函数,就可以了。

也许这会帮助这个星球上的其他灵魂,所以值得痛苦。