代码之家  ›  专栏  ›  技术社区  ›  dododo

Azure cosmos db通过资源令牌连接问题

  •  1
  • dododo  · 技术社区  · 8 年前

    cosmos db Resource token 而不是帐户 master key 我以前用过。 DocumentClient :

        var client = new DocumentClient(new Uri(configAccountName), configAccountKey);
        await client.OpenAsync();
    

    这种方法效果很好,但我想使用 resource token link1 link2 .

    db user All permissions 按以下代码:

        public static async Task<User> CreateUserAndPermissionAsync(this DocumentClient client, string userId)
        {
            var dbUri = UriFactory.CreateDatabaseUri(dataBase);
            var user = await client.CreateUserAsync(dbUri, new User { Id = userId });
            var collectionUri = UriFactory.CreateDocumentCollectionUri(dataBase, collectionName);
            var permission = await client.CreatePermissionAsync(
                user.Resource.SelfLink,
                new Permission
                {
                    Id = "MyPermission",
                    PermissionMode = PermissionMode.All,
                    ResourceLink = collectionUri.ToString(),
                    ResourcePartitionKey = new PartitionKey(userId)
                });
            return user.Resource;
        }
    

    用户创建正确,我可以通过 ReadUserAsync ReadPermissionAsync 方法。 然后,我想创建 文档客户端 permissions

        //this is a temporally document client instance to read permissions for my user in below extensions method versions
        var client = new DocumentClient(new Uri(configAccountName), configAccountKey);
    

    我已经检查了3种方法(其中一些类似)。我试着给每一种方式打电话,以获得新的 文档客户端 实例( 变量),然后调用 OpenAsync

        var newClient = await client.GetClientForUserAsync_v###(userName);
        await newClient.OpenAsync();
    

    所有尝试均失败

        //version 1:
        public static async Task<DocumentClient> GetClientForUserAsync_v1(this DocumentClient client, string userId)
        {
            var userUri = UriFactory.CreateUserUri(dataBase, userId).ToString();
            var permissionsUri = $"{userUri}/permissions";
            var permissions = (await client.ReadPermissionFeedAsync(permissionsUri)).ToList();
            return new DocumentClient(
                client.ServiceEndpoint,
                permissions,
                client.ConnectionPolicy);
        }
    

    OpenAsync 方法因以下错误而崩溃: 无法将值“”解析为ResourceId。,documentdb dotnet sdk/1.22.0主机/32位MicrosoftWindowsNT/6.2.9200.0

        //version 2:
        public static async Task<DocumentClient> GetClientForUserAsync_v2(this DocumentClient client, string userId)
        {
            var userUri = UriFactory.CreateUserUri(dataBase, userId).ToString();
            var permissionsUri = $"{userUri}/permissions";
            var permissions = (await client.ReadPermissionFeedAsync(permissionsUri)).ToList();
            return new DocumentClient(
                client.ServiceEndpoint,
                permissions[0].Token,
                client.ConnectionPolicy);
        }
    

    OpenAsync 方法因以下错误而崩溃: ActivityId:##ReplacedActivityId##,Microsoft。蔚蓝色的文件。Common/1.22.0.0,documentdb dotnet sdk/1.22.0主机/32位MicrosoftWindowsNT/6.2.9200.0

        //version 3:
        public static async Task<DocumentClient> GetClientForUserAsync_v3(this DocumentClient client, string userId)
        {
            FeedResponse<Permission> permFeed = await client.ReadPermissionFeedAsync(UriFactory.CreateUserUri(dataBase, userId));
            List<Permission> permList = new List<Permission>();
    
            foreach (Permission perm in permFeed)
            {
                permList.Add(perm);
            }
    
            DocumentClient userClient = new DocumentClient(new Uri(client.ServiceEndpoint.AbsoluteUri), permList, new ConnectionPolicy()
            {
                //**UPDATE**: I tried all ConnectionMode values as well as without this parameter
                ConnectionMode = ConnectionMode.Gateway
            });
            return userClient;
        }     
    

    这个 OpenAsync .

    第一个和第三个错误是最奇怪的,因为我已经检查过了,我看到了 ResourceId 中的值 变量(作为项目 永久列表 权限 来自第一个版本的变量。

    有人能帮忙吗?

    更新 无法将值“”解析为ResourceId。,documentdb dotnet sdk/1.22.0主机/32位MicrosoftWindowsNT/6.2.9200.0

        //version 4
        public static async Task<DocumentClient> GetClientForUserAsync_v4(this DocumentClient client, string userId)
        {
            var user = await client.ReadUserAsync(UriFactory.CreateUserUri(dataBase, userId));
            var permissions = await client.ReadPermissionFeedAsync(user.Resource.SelfLink);
            List<Permission> permList = new List<Permission>();
    
            foreach (Permission perm in permissions)
            {
                permList.Add(perm);
            }
    
            DocumentClient userClient = new DocumentClient(new Uri(client.ServiceEndpoint.AbsoluteUri), permList, new ConnectionPolicy()
            {
                ConnectionMode = ConnectionMode.Direct
            });
            return userClient;
        }
    
    3 回复  |  直到 8 年前
        1
  •  0
  •   Lee Liu    8 年前

    Cosmos DB资源令牌将在建立权限时生成。我们可以使用资源令牌连接到Cosmos DB,如下所示:

    var client = new DocumentClient(new Uri(endPointUri), resourceToken );
    

        public static async Task<Dictionary<PermissionMode, string>> GetPermissonTokens(DocumentClient client,string DatabaseId,string userId)
        {
            FeedResponse<Permission> permFeed =  await client.ReadPermissionFeedAsync(UriFactory.CreateUserUri(DatabaseId, userId));
    
            Dictionary<PermissionMode,string> permList = new Dictionary<PermissionMode, string>();
    
            foreach (Permission perm in permFeed)
            {
    
                permList.Add(perm.PermissionMode, perm.Token);
            }
    
            return permList;
        }
    

    以下是一个完整的演示,供您参考:

        static void Main(string[] args)
        {
            //create DocumentClient instance with end point Uri and primary key
            DocumentClient client = new DocumentClient(new Uri("https://xxxx.xxxxx.azure.com:443/"), "ikhSrMZIGKBrF1xxxxx7iDSLBMJD37oCOlw2N24YoBtfAV7HJFfVgNbhCfQdWGAq3eZY4FyX3z6zsWoRLHQ==", new ConnectionPolicy { EnableEndpointDiscovery = false });
    
            Task<Dictionary<PermissionMode, string>> task = GetPermissonTokens(client, "Test2", "testUser2");
            task.Wait();
            Dictionary<PermissionMode, string> permissionTokens = task.Result;
    
            DocumentClient userClient = new DocumentClient(client.ReadEndpoint, permissionTokens[PermissionMode.All]);
            if (userClient != null)
            {
                //then we can do CRUD operation to Cosmos DB Here 
            }
        }
    
    
        public static async Task<Dictionary<PermissionMode, string>> GetPermissonTokens(DocumentClient client,string DatabaseId,string userId)
        {
            FeedResponse<Permission> permFeed =  await client.ReadPermissionFeedAsync(UriFactory.CreateUserUri(DatabaseId, userId));
    
            Dictionary<PermissionMode,string> permList = new Dictionary<PermissionMode, string>();
    
            foreach (Permission perm in permFeed)
            {
    
                permList.Add(perm.PermissionMode, perm.Token);
            }
    
            return permList;
        }
    
        2
  •  0
  •   Walid Hanafy    7 年前

        private async Task<string> GetUserToken()
        {
            User user = null;
            try
            {
                try
                {
                    var uri = UriFactory.CreateUserUri(config.Database, config.PartitionKey);
                    client.DeleteUserAsync(uri).Wait();
    
                    user = await client.ReadUserAsync(UriFactory.CreateUserUri(config.Database, config.PartitionKey));
    
                    var permission = await GetorCreatePermission(user, config.Collection, config.PartitionKey);
                    return permission.Token;
                }
                catch (Exception ex) {
                    Console.WriteLine(ex.Message);
                }
                if (user == null)
                {
                    user = new User
                    {
                        Id = config.PartitionKey
                    };
                    user = await client.CreateUserAsync(UriFactory.CreateDatabaseUri(config.Database), user);
                    var permission = await GetorCreatePermission(user, config.Collection, config.PartitionKey);
                    return permission.Token;
                }
                else
                {
                    throw new Exception("");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    
        3
  •  0
  •   Darey    6 年前

    在多次尝试之后,我得出的一个结论是,在为集合创建权限时不包括PartitionKey。下面的调整为我完成了这项工作,我能够使用资源令牌成功地将内容添加到我的集合中。

        new Permission
        {
            Id = "MyPermission",
            PermissionMode = PermissionMode.All,
            ResourceLink = collectionUri.ToString()
        });