权限中的令牌使用documentdb和xamarin表单消失

时间:2017-06-07 15:55:00

标签: azure xamarin xamarin.forms azure-cosmosdb

我正在尝试将特定用户的documentdb权限从我的azure服务器发送到我的客户端应用程序,这些是xamarin表单。

在服务器端,一切看起来都不错,我可以看到用户特定的权限和令牌。

Server side

但是当客户端收到权限时,令牌会被剥夺,为什么? 我是documentdb的新手,所以希望它只是我。

Client side

我使用Azure移动应用服务作为后端。 我的后端控制器返回一个包含documentdb数据库属性的对象,包括用户的权限列表。

>>> import itertools as it
>>> list(it.chain.from_iterable(item if isinstance(item,collections.Iterable) and not isinstance(item, str) else [item] for item in nested))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

如果尚未创建整个集合,我为用户创建权限。

    public class DbConfig
{
    public string DatabaseName { get; set; }
    public string CollectionId { get; set; }
    public string EndpointUri { get; set; }
    public IList<Permission> Permissions { get; set; }

}

我使用此方法检索用户的权限。

        public async Task<Permission> CreatePermissionAsync(string resourceLink, string userLink, PermissionMode mode, string resourcePartitionKey = null)
    {
        try
        {

            Permission permission = new Permission
            {
                Id = Guid.NewGuid().ToString("N"),
                PermissionMode = mode,
                ResourceLink = resourceLink
            };

            if (resourcePartitionKey != null)
            {
                permission.ResourcePartitionKey = new PartitionKey(resourcePartitionKey);
            }

            var result = await client.CreatePermissionAsync(userLink, permission);
            DbConfig.Permissions.Add(result);
            return result;
        }
        catch (Exception e)
        {
            Trace.WriteLine($"##### Exception: {e}");
            throw;
        }
    }

在我的Xamarin表单应用程序的客户端,我使用此调用到后端的自定义控制器。

        public List<Permission> GetPermissionsForUserPermissionLink(User user)
    {
        var permFeed = client.CreatePermissionQuery(user.PermissionsLink);
        List<Permission> permList = new List<Permission>();

        foreach (Permission perm in permFeed)
        {
            permList.Add(perm);
            DbConfig.Permissions.Add(perm);
        }

        return permList;
    }

当我查看dbConfig对象中的permissionlist时,权限的标记为null。我的想法是我可以根据权限列表实例化一个documentdb客户端,但它失败了。

var parameters = new Dictionary<string, string> { { "userid", Settings.AzureUserId } };
dbConfig = await client.InvokeApiAsync<DbConfig>("Settings", HttpMethod.Get, parameters);

来自答案的编辑

只是为了完成问题。 我创建了一个包含Permission和Token

的自定义类
        public void CreateDocumentDbClient(DbConfig config)
    {
        client = new DocumentClient(new Uri(config.EndPointUri), config.Permissions);
        collectionLink = UriFactory.CreateDocumentCollectionUri(config.DatabaseName, config.CollectionId);
        IsInitialized = true;
    }

这样就可以像这样创建一个documentdb客户端:

    public class PermissionCustom
{
    public Permission  Permission { get; set; }
    public string Token { get; set; }
}

到目前为止一直很好:-)但是考虑到用户可以拥有不同资源的许多权限,它不会使您的数据库更加安全。即使正确地使其更安全,但令牌首先是只读的。

1 个答案:

答案 0 :(得分:0)

根据您的代码,我检查了这个问题,发现我可能会遇到同样的问题。当您调用client.InvokeApiAsync<DbConfig>("Settings", HttpMethod.Get, parameters);时,您将使用以下链接发送请求:

https://{your-app-name}.azurewebsites.net/api/settings?userid={Settings.AzureUserId}

使用fiddler您可以发现令牌已发送到您的移动客户端,如下所示:

enter image description here

但是当将其反序列化为Permission时,令牌尚未正确初始化。我发现token属性只读如下:

enter image description here

总之,我建议您需要定义自定义Permission类,并参考DocumentDB客户端SDK提供的Permission类,以便在移动设备的自定义权限类中定义所需的属性客户端。